home *** CD-ROM | disk | FTP | other *** search
/ C & C++ Multimedia Cyber Classroom / C and C++ Multimedia Cyber Classroom (Prentice Hall) (1998).iso / cpphtp2 / cpphtp2.jar / chpt_14.gml < prev    next >
Text File  |  1998-03-03  |  98KB  |  2,213 lines

  1. <html>
  2. <chapter>
  3. <section type=Popup name=Terminology title="Terminology">
  4. <page>
  5. <font size=14>
  6. B<br>
  7. bit 
  8. <a href="%s2p0"><img src=iicons/bullbib.gif></a>
  9. <br>
  10. byte 
  11. <a href="%s2p2"><img src=iicons/bullbib.gif></a>
  12. <br>
  13. C<br>
  14. <b>cerr</b> 
  15. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  16. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  17. <br>
  18. character 
  19. <a href="%s2p1"><img src=iicons/bullbib.gif></a>
  20. <br>
  21. character set 
  22. <a href="%s2p2"><img src=iicons/bullbib.gif></a>
  23. <br>
  24. <b>cin</b> 
  25. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  26. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  27. <a href="%s4p7"><img src=iicons/bullbib.gif></a>
  28. <a href="%s4p9"><img src=iicons/bullbib.gif></a>
  29. <br>
  30. <b>clog</b> 
  31. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  32. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  33. <br>
  34. <b>close</b> 
  35. <a href="%s4p10"><img src=iicons/bullbib.gif></a>
  36. <br>
  37. <b>cout</b> 
  38. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  39. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  40. <br>
  41. D<br>
  42. data hierarchy 
  43. <a href="%s2p0"><img src=iicons/bullbib.gif></a>
  44. <a href="%s2p3"><img src=iicons/bullbib.gif></a>
  45. <a href="%s2p5"><img src=iicons/bullbib.gif></a>
  46.  
  47. <a href="^Illustration::c:s0p1"><img src=iicons/bullbib.gif></a>
  48. <br>
  49. </font>
  50.  
  51. </page>
  52. <page>
  53. <font size=14>
  54. database 
  55. <a href="%s2p6"><img src=iicons/bullbib.gif></a>
  56. <br>
  57. database management 
  58. system (DBMS) 
  59. <a href="%s2p7"><img src=iicons/bullbib.gif></a>
  60. <br>
  61. decimal digit 
  62. <a href="%s2p1"><img src=iicons/bullbib.gif></a>
  63. <br>
  64. E<br>
  65. end-of-file 
  66. <a href="%s4p9"><img src=iicons/bullbib.gif></a>
  67. <br>
  68. end-of-file marker 
  69. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  70. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  71. <br>
  72. F<br>
  73. field 
  74. <a href="%s2p2"><img src=iicons/bullbib.gif></a>
  75. <br>
  76. file 
  77. <a href="%s1p0"><img src=iicons/bullbib.gif></a>
  78. <a href="%s2p4"><img src=iicons/bullbib.gif></a>
  79. <a href="%s5p2"><img src=iicons/bullbib.gif></a>
  80. <br>
  81. file position pointer 
  82. <a href="%s5p4"><img src=iicons/bullbib.gif></a>
  83.  
  84. <a href="%s5p5"><img src=iicons/bullbib.gif></a>
  85. <a href="%s9p1"><img src=iicons/bullbib.gif></a>
  86. <a href="%s11p1"><img src=iicons/bullbib.gif></a>
  87. <br>
  88. filename 
  89. <a href="%s4p2"><img src=iicons/bullbib.gif></a>
  90. <a href="%s5p1"><img src=iicons/bullbib.gif></a>
  91. <br>
  92. </font>
  93.  
  94. </page>
  95. <page>
  96. <font size=14>
  97. <b>fstream</b> 
  98. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  99. <a href="%s4p2"><img src=iicons/bullbib.gif></a>
  100. <a href="%s11p1"><img src=iicons/bullbib.gif></a>
  101. <a href="%s11p6"><img src=iicons/bullbib.gif></a>
  102.  
  103. <br>
  104. <b><fstream.h></b> 
  105. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  106. <br>
  107. I<br>
  108. <b>ifstream</b> 
  109. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  110. <a href="%s4p2"><img src=iicons/bullbib.gif></a>
  111. <a href="%s5p0"><img src=iicons/bullbib.gif></a>
  112. <a href="%s5p2"><img src=iicons/bullbib.gif></a>
  113.  
  114. <a href="%s10p1"><img src=iicons/bullbib.gif></a>
  115. <br>
  116. <b>ios::app</b> 
  117. <a href="%s4p2"><img src=iicons/bullbib.gif></a>
  118. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  119. <br>
  120. <b>ios::ate</b> 
  121. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  122. <a href="%s9p1"><img src=iicons/bullbib.gif></a>
  123. <br>
  124. <b>ios::beg</b> 
  125. <a href="%s5p5"><img src=iicons/bullbib.gif></a>
  126. <br>
  127. <b>ios::cur</b> 
  128. <a href="%s5p5"><img src=iicons/bullbib.gif></a>
  129. <br>
  130. <b>ios::end</b> 
  131. <a href="%s5p5"><img src=iicons/bullbib.gif></a>
  132. <br>
  133. <b>ios::in</b> 
  134. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  135. <a href="%s5p1"><img src=iicons/bullbib.gif></a>
  136. <a href="^Practice::c:s0p0"><img src=iicons/bullbib.gif></a>
  137.  
  138. <a href="%s11p6"><img src=iicons/bullbib.gif></a>
  139. <br>
  140. <b>ios::nocreate</b> 
  141. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  142. <br>
  143. </font>
  144.  
  145. </page>
  146. <page>
  147. <font size=14>
  148. <b>ios::noreplace</b> 
  149. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  150. <br>
  151. <b>ios::out</b> 
  152. <a href="%s4p2"><img src=iicons/bullbib.gif></a>
  153. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  154. <a href="%s11p6"><img src=iicons/bullbib.gif></a>
  155.  
  156. <br>
  157. <b>ios::trunc</b> 
  158. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  159. <br>
  160. <b>istream</b> 
  161. <a href="%s3p2"><img src=iicons/bullbib.gif></a>
  162. <a href="%s5p4"><img src=iicons/bullbib.gif></a>
  163. <a href="%s5p4"><img src=iicons/bullbib.gif></a>
  164. <a href="%s8p0"><img src=iicons/bullbib.gif></a>
  165.  
  166. <a href="%s10p0"><img src=iicons/bullbib.gif></a>
  167. <a href="%s11p1"><img src=iicons/bullbib.gif></a>
  168. <a href="%s12p0"><img src=iicons/bullbib.gif></a>
  169. <br>
  170. O<br>
  171. <b>ofstream</b> 
  172. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  173. <a href="%s4p2"><img src=iicons/bullbib.gif></a>
  174. <a href="%s4p3"><img src=iicons/bullbib.gif></a>
  175. <a href="%s4p4"><img src=iicons/bullbib.gif></a>
  176.  
  177. <a href="%s4p10"><img src=iicons/bullbib.gif></a>
  178. <a href="%s5p2"><img src=iicons/bullbib.gif></a>
  179. <a href="%s8p5"><img src=iicons/bullbib.gif></a>
  180. <a href="%s9p1"><img src=iicons/bullbib.gif></a>
  181. <a href="%s10p3"><img src=iicons/bullbib.gif></a>
  182. <br>
  183. <b>open</b> 
  184. <a href="%s4p5"><img src=iicons/bullbib.gif></a>
  185. <br>
  186. open a file for input 
  187. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  188. <br>
  189. open a file for output 
  190. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  191.  
  192. <a href="^Illustration::c:s0p4"><img src=iicons/bullbib.gif></a>
  193. <br>
  194. </font>
  195.  
  196. </page>
  197. <page>
  198. <font size=14>
  199. <b>operator void*</b> member 
  200. function 
  201. <a href="%s4p7"><img src=iicons/bullbib.gif></a>
  202. <br>
  203. <b>operator!</b> member 
  204. function 
  205. <a href="%s4p5"><img src=iicons/bullbib.gif></a>
  206. <br>
  207. <b>ostream</b> 
  208. <a href="%s3p2"><img src=iicons/bullbib.gif></a>
  209. <a href="%s5p4"><img src=iicons/bullbib.gif></a>
  210. <a href="%s5p4"><img src=iicons/bullbib.gif></a>
  211. <a href="%s8p0"><img src=iicons/bullbib.gif></a>
  212.  
  213. <a href="%s10p3"><img src=iicons/bullbib.gif></a>
  214. <a href="%s12p0"><img src=iicons/bullbib.gif></a>
  215. <br>
  216. R<br>
  217. random access file 
  218. <a href="%s1p0"><img src=iicons/bullbib.gif></a>
  219. <a href="%s7p1"><img src=iicons/bullbib.gif></a>
  220.  
  221. <a href="%s7p1"><img src=iicons/bullbib.gif></a>
  222. <a href="%s8p3"><img src=iicons/bullbib.gif></a>
  223. <a href="%s10p0"><img src=iicons/bullbib.gif></a>
  224. <a href="%s11p0"><img src=iicons/bullbib.gif></a>
  225. <br>
  226. record 
  227. <a href="%s2p3"><img src=iicons/bullbib.gif></a>
  228. <a href="%s4p0"><img src=iicons/bullbib.gif></a>
  229. <a href="%s5p2"><img src=iicons/bullbib.gif></a>
  230. <a href="%s10p3"><img src=iicons/bullbib.gif></a>
  231.  
  232. <a href=""><img src=iicons/bullbib.gif></a>
  233. <br>
  234. record key 
  235. <a href=""><img src=iicons/bullbib.gif></a>
  236. <a href=""><img src=iicons/bullbib.gif></a>
  237. <br>
  238. S<br>
  239. <b>seekg</b> 
  240. <a href="%s5p4"><img src=iicons/bullbib.gif></a>
  241. <a href="%s11p1"><img src=iicons/bullbib.gif></a>
  242. <br>
  243. </font>
  244.  
  245. </page>
  246. <page>
  247. <font size=14>
  248. <b>seekp</b> 
  249. <a href="%s5p4"><img src=iicons/bullbib.gif></a>
  250. <a href="%s9p0"><img src=iicons/bullbib.gif></a>
  251. <a href="%s9p1"><img src=iicons/bullbib.gif></a>
  252.  
  253. <br>
  254. sequential access file 
  255. <a href="%s1p0"><img src=iicons/bullbib.gif></a>
  256.  
  257. <a href="%s4p0"><img src=iicons/bullbib.gif></a>
  258. <a href="%s6p0"><img src=iicons/bullbib.gif></a>
  259. <a href="%s7p0"><img src=iicons/bullbib.gif></a>
  260. <br>
  261. stream classes 
  262. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  263. <br>
  264. T<br>
  265. <b>tellg</b> 
  266. <a href="%s5p6"><img src=iicons/bullbib.gif></a>
  267. <br>
  268. <b>tellp</b> 
  269. <a href="%s5p6"><img src=iicons/bullbib.gif></a>
  270. <br>
  271. truncate 
  272. <a href="%s4p2"><img src=iicons/bullbib.gif></a>
  273. <br>
  274. <br>
  275. </font>
  276.  
  277. </page>
  278. </section>
  279. <section type=Popup name=Quotes title="Quotes">
  280. <page>
  281. <i>I can only assume that a 
  282. "Do Not File" document 
  283. is filed in a "Do Not File" 
  284. file.</i> <br>
  285. Senator Frank Church<p>
  286. Senate Intelligence 
  287. Subcommittee Hearing, 
  288. 1975<br>
  289. <br>
  290.  
  291. </page>
  292. <page>
  293. <i>I read part of it all the 
  294. way through.</i>  <br>
  295. Samuel Goldwyn<br>
  296. <br>
  297.  
  298. </page>
  299. </section>
  300. <section type=Popup name=Illustration title="Illustrations">
  301. <page>
  302. <a href="^Illustration::c:s0p1">Fig. 14.1</a>  The data hierarchy.<br>
  303. <a href="^Illustration::c:s0p2">Fig. 14.2</a>  C++'s view of a file of <b>n</b> bytes.<br>
  304. <a href="^Illustration::c:s0p3">Fig. 14.3</a>  Portion of stream I/O class hierarchy.<br>
  305. <a href="^Code::c:s0p0">Fig. 14.4</a>  Creating a sequential file.<br>
  306. <a href="^Illustration::c:s0p4">Fig. 14.5</a>  File open modes.<br>
  307. <a href="^Illustration::c:s0p5">Fig. 14.6</a>  End-of-file key combinations for various popular computer systems.<br>
  308. <a href="^Code::c:s0p1">Fig. 14.7</a>  Reading and printing a sequential file.<br>
  309. <a href="^Code::c:s0p2">Fig. 14.8</a>  Credit inquiry program.<br>
  310. <a href="^Illustration::c:s0p6">Fig. 14.10</a>  C++'s view of a random access file.<br>
  311. <a href="^Code::c:s0p3">Fig. 14.11</a>  Creating a random access file sequentially.<br>
  312. <a href="^Code::c:s0p4">Fig. 14.12</a>  Writing data randomly to a random access file.<br>
  313. <a href="^Code::c:s0p5">Fig. 14.14</a>  Reading a random access file sequentially.<br>
  314. <a href="^Code::c:s0p6">Fig. 14.15</a>  Bank account program.<br>
  315. <br>
  316.  
  317. </page>
  318. <page>
  319. <font size=18><a href="~audio/Ch14/14fig001.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 14.1 - The data hierarchy.<img src="graphics/ch14/fig14001.gif" ></font><br>
  320.  
  321. </page>
  322. <page>
  323. <font size=18><a href="~audio/Ch14/14fig002.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 14.2 - C++'s view of a file of <b>n</b> bytes.<img src="graphics/ch14/fig14002.gif" ></font><br>
  324.  
  325. </page>
  326. <page>
  327. <font size=18><a href="~audio/Ch14/14fig003.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 14.3 - Portion of stream I/O class hierarchy.<img src="graphics/ch14/fig14003.gif" ></font><br>
  328.  
  329. </page>
  330. <page>
  331. <font size=18>Fig<a href="~audio/Ch14/14fig005.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>ure 14.5 - File open modes.<img src="graphics/ch14/fig14005.gif" ></font><br>
  332.  
  333. </page>
  334. <page>
  335. <font size=18><a href="~audio/Ch14/14fig006.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 14.6 - End-of-file key combinations for various popular computer systems.<i></i><i></i></font><br>
  336. <img src="graphics/ch14/fig14006.gif" ><br>
  337.  
  338. </page>
  339. <page>
  340. <font size=18><a href="~audio/Ch14/14fig010.au"><img src="bckgrnds/icons/audio.gif" align=sidebar></a>Figure 14.10 - C++'s view of a random access file.<img src="graphics/ch14/fig14010.gif" ></font><br>
  341.  
  342. </page>
  343. </section>
  344. <section type=Popup name=Answers title="Answers">
  345. <page pagename="Answer 14.1">
  346. <b>Answer 14.1</b><br>
  347. a) <b>1</b>s, <b>0</b>s.<br>
  348. b) Bit.<br>
  349. c) File.<br>
  350. d) Characters.<br>
  351. e) Database.<br>
  352. f) <b>close</b>.<br>
  353. g) <b>get</b>.<br>
  354. h) <b>get</b>, <b>getline</b>.<br>
  355. i) <b>open</b>.<br>
  356. j) <b>read</b>.<br>
  357. <foreign  name="exercises" url="^Exercises::c:s0p0">
  358.  
  359. </page>
  360. <page pagename="Answer 14.1">
  361. k) <b>seekg</b>, <b>seekp</b>.<br>
  362. <foreign  name="exercises" url="^Exercises::c:s0p0">
  363. <br>
  364. <br>
  365.  
  366. </page>
  367. <page pagename="Answer 14.2">
  368. <b>Answer 14.2</b><br>
  369. a)  False. Function <b>read</b> can be used to read from any input stream object derived 
  370. from <b>istream</b>.<br>
  371. b)  False. These four streams are created automatically for the programmer. The 
  372. <b><iostream.h></b> header file must be included in a file to use them. This header 
  373. includes declarations of each of these stream objects.<br>
  374. c)  False. The files will be closed when destructors for <b>ifstream</b>, <b>ofstream</b>, or 
  375. <b>fstream</b> objects are executed when the stream objects go out of scope or before 
  376. program execution terminates, but it is a good programming practice to close all 
  377. files explicitly with <b>close</b> once they are no longer needed.<br>
  378. <foreign  name="exercises" url="^Exercises::c:s0p2">
  379.  
  380. </page>
  381. <page pagename="Answer 14.2">
  382. d)  False. Member function <b>seekp</b> or <b>seekg</b> can be used to reposition the put or 
  383. get file position pointer to the beginning of the file.<br>
  384. e)  True.<br>
  385. f)  False. In most cases, sequential file records are not of uniform length. 
  386. Therefore, it is possible that updating a record will cause other data to be 
  387. overwritten.<br>
  388. g)  True.<br>
  389. h)  False. Records in a random access file are normally of uniform length.<br>
  390. i)  False. It is possible to seek from the beginning of the file, from the end of the 
  391. file, and from the current position in the file.<br>
  392. <foreign  name="exercises" url="^Exercises::c:s0p2">
  393. <br>
  394.  
  395. </page>
  396. <page pagename="Answer 14.3">
  397. <b>Answer 14.3</b><br>
  398. <font size=2><br></font><font size=11><pre>
  399. a)  ifstream inOldMaster( "oldmast.dat", ios::in );<p>
  400. b)  ifstream inTransaction( "trans.dat", ios::in );<p>
  401. c)  ofstream outNewMaster( "newmast.dat", ios::out );<p>
  402. d)  inOldMaster >> accountNum >> name >> currentBalance;<p>
  403. e)  inTransaction >> accountNum >> dollarAmount;<p>
  404. f)  outNewMaster << accountNum << name << currentBalance;<p>
  405. </pre></font>
  406. <foreign  name="exercises" url="^Exercises::c:s0p4">
  407. <br>
  408. <br>
  409.  
  410. </page>
  411. <page pagename="Answer 14.4">
  412. <b>Answer 14.4</b><br>
  413. a)  Error: The file "<b>payables.dat</b>" has not been opened before the attempt is 
  414. made to output data to the stream.<br>
  415.       Correction: Use <b>ostream</b> function open to open "<b>payables.dat</b>" for output.<br>
  416. b)  Error: The incorrect <b>istream</b> object is being used to read a record from file 
  417. "<b>payables.dat</b>". <br>
  418.       Correction: Use <b>istream</b> object <b>inPayable</b> to refer to "<b>payables.dat</b>".<br>
  419. c)  Error: The contents of the file are discarded because the file is opened for 
  420. output (<b>ios::out</b>).<br>
  421.       Correction: To add data to the file, either open the file for updating (<b>ios::ate</b>) 
  422. or open the file for appending (<b>ios::app</b>).<br>
  423. <foreign  name="exercises" url="^Exercises::c:s0p6">
  424.  
  425. </page>
  426. <page pagename="Answer 14.7">
  427. <b>Answer 14.7</b><br>
  428. The solution to this exercise can be found on your Cyber Classroom CD. Copy 
  429. the file cpphtp2/answers/P14_07.zip to your hard drive and unzip the program 
  430. code.<br>
  431. <foreign  name="exercises" url="^Exercises::c:s0p12">
  432. <br>
  433.  
  434. </page>
  435. <page pagename="Answer 14.12">
  436. <b>Answer 14.12</b><br>
  437. The solution to this exercise can be found on your Cyber Classroom CD. Copy 
  438. the file cpphtp2/answers/P14_12.zip to your hard drive and unzip the program 
  439. code.<br>
  440. <foreign  name="exercises" url="^Exercises::c:s0p23">
  441. <br>
  442.  
  443. </page>
  444. <page pagename="Answer 14.14">
  445. <b>Answer 14.14</b><br>
  446. The solution to this exercise can be found on your Cyber Classroom CD. Copy 
  447. the file cpphtp2/answers/P14_14.zip to your hard drive and unzip the program 
  448. code.<br>
  449. <foreign  name="exercises" url="^Exercises::c:s0p26">
  450. <br>
  451.  
  452. </page>
  453. </section>
  454. <section type=Popup name=Exercises title="Exercises">
  455. <page pagename="Exercise 14.1">
  456. <b>Exercise 14.1</b><br>
  457. Fill in the blanks in each of the following:<br>
  458. a)  Ultimately, all data items processed by a computer are reduced to 
  459. combinations of________and ________.<br>
  460. b)  The smallest data item a computer can process is called a ________.<br>
  461. c)  A ________ is a group of related records.<br>
  462. d)  Digits, letters, and special symbols are referred to as ________.<br>
  463. e)  A group of related files is called a ________.<br>
  464. f)  Member function ________ of the file stream classes <b>fstream</b>, <b>ifstream</b>, 
  465. and <b>ofstream</b> closes a file.<br>
  466. g)  The <b>istream</b> member function ________ reads a character from the 
  467. specified stream.<br>
  468. <foreign  name="answers" url="^Answers::c:s0p0">
  469.  
  470. </page>
  471. <page pagename="Exercise 14.1">
  472. h)  The <b>istream</b> member functions ________ and ________ read a line from 
  473. the specified stream.<br>
  474. i)  Member function ________ of the file stream classes <b>fstream</b>, <b>ifstream</b>, 
  475. and <b>ofstream</b> opens a file.<br>
  476. j)  The <b>istream</b> member function ________ is normally used when reading 
  477. data from a file in random access applications.<br>
  478. k)  Member functions ________ and ________ of the <b>istream</b> and <b>ostream</b> 
  479. classes set the appropriate position pointer to a specific location in an input or 
  480. output stream respectively.<br>
  481. <foreign  name="answers" url="^Answers::c:s0p0">
  482. <br>
  483. <br>
  484.  
  485. </page>
  486. <page pagename="Exercise 14.2">
  487. <b>Exercise 14.2</b><br>
  488. State which of the following are true and which are false (for those that are false, 
  489. explain why):<br>
  490. a)  Member function <b>read</b> cannot be used to read data from the input object <b>cin</b>.<br>
  491. b)  The programmer must explicitly create the <b>cin</b>, <b>cout</b>, <b>cerr</b>, and <b>clog</b> objects.<br>
  492. c)  A program must explicitly call function <b>close</b> to close a file associated with 
  493. an <b>ifstream</b>, <b>ofstream</b>, or <b>fstream</b> object.<br>
  494. d)  If the file position pointer points to a location in a sequential file other than 
  495. the beginning of the file, the file must be closed and reopened to read from the 
  496. beginning of the file.<br>
  497. e)  The <b>ostream</b> member function <b>write</b> can write to standard output stream 
  498. cout.<br>
  499. <foreign  name="answers" url="^Answers::c:s0p2">
  500.  
  501. </page>
  502. <page pagename="Exercise 14.2">
  503. f)  Data in sequential access files is always updated without overwriting nearby 
  504. data.<br>
  505. g)  It is not necessary to search through all the records in a random access file to 
  506. find a specific record.<br>
  507. h)  Records in random access files must be of uniform length.<br>
  508. i)  Member functions <b>seekp</b> and <b>seekg</b> must seek relative to the beginning of a 
  509. file.<br>
  510. <foreign  name="answers" url="^Answers::c:s0p2">
  511. <br>
  512. <br>
  513.  
  514. </page>
  515. <page pagename="Exercise 14.3">
  516. <b>Exercise 14.3</b><br>
  517. Assume that each of the following statements applies to the same program.<br>
  518. a)  Write a statement that opens file "<b>oldmast.dat</b>" for input; use <b>ifstream</b> 
  519. object <b>inOldMaster</b>.<br>
  520. b)  Write a statement that opens file "<b>trans.dat</b>" for input; use <b>ifstream</b> object 
  521. <b>inTransaction</b>.<br>
  522. c)  Write a statement that opens file "<b>newmast.dat</b>" for output (and creation); 
  523. use <b>ofstream</b> object <b>outNewMaster</b>.<br>
  524. e)  Write a statement that reads a record from the file "<b>oldmast.dat</b>". The 
  525. record consists of integer <b>accountNum</b>, string <b>name</b>, and floating point 
  526. <b>currentBalance</b>; use <b>ifstream</b> object <b>inOldMaster</b>.<br>
  527. <foreign  name="answers" url="^Answers::c:s0p4">
  528.  
  529. </page>
  530. <page pagename="Exercise 14.3">
  531. f)  Write a statement that reads a record from the file "<b>trans.dat</b>". The record 
  532. consists of integer <b>accountNum</b> and floating point <b>dollarAmount</b>; use <b>ifstream</b> 
  533. object <b>inTransaction</b>.<br>
  534. g)  Write a statement that writes a record to the file "<b>newmast.dat</b>". The record 
  535. consists of integer <b>accountNum</b>, string <b>name</b>, and floating point 
  536. <b>currentBalance</b>; use <b>ofstream</b> object <b>outNewMaster</b>.<br>
  537. <foreign  name="answers" url="^Answers::c:s0p4">
  538. <br>
  539. <br>
  540.  
  541. </page>
  542. <page pagename="Exercise 14.4">
  543. <b>Exercise 14.4</b><br>
  544. Find the error and show how to correct it in each of the following. <br>
  545. a)  File "<b>payables.dat</b>" referred to by <b>ofstream</b> object <b>outPayable</b> has not been 
  546. opened.<br>
  547. <font size=2><br></font><font size=11><pre>
  548. outPayable << account << company << amount << endl;<p>
  549. </pre></font>
  550. b)  The following statement should read a record from the file "<b>payables.dat</b>". 
  551. The <b>ifstream</b> object <b>inPayable</b> refers to this file, and <b>istream</b> object 
  552. <b>inReceivable</b> refers to the file "<b>receivables.dat</b>".<br>
  553. <font size=2><br></font><font size=11><pre>
  554. inReceivable >> account >> company >> amount;<p>
  555. </pre></font>
  556. c)  The file "<b>tools.dat</b>" should be opened to add data to the file without 
  557. discarding the current data.<br>
  558. <foreign  name="answers" url="^Answers::c:s0p5">
  559.  
  560. </page>
  561. <page pagename="Exercise 14.4">
  562. <font size=2><br></font><font size=11><pre>
  563. ofstream outTools( "tools.dat", ios::out );<p>
  564. </pre></font>
  565. <foreign  name="answers" url="^Answers::c:s0p5">
  566. <br>
  567. <br>
  568.  
  569. </page>
  570. <page pagename="Exercise 14.5">
  571. <b>Exercise 14.5</b><br>
  572. Fill in the blanks in each of the following:<br>
  573. a)  Computers store large amounts of data on secondary storage devices as 
  574. ______.<br>
  575. b)  A ________ is composed of several fields.<br>
  576. c)  A field that may contain only digits, letters, and blanks is called 
  577. an________ field.<br>
  578. d)  To facilitate the retrieval of specific records from a file, one field in each 
  579. record is chosen as a ________.<br>
  580. e)  The vast majority of information stored in computer systems is stored in 
  581. ________ files.<br>
  582. f)  A group of related characters that conveys meaning is called a ________.<br>
  583.  
  584. </page>
  585. <page pagename="Exercise 14.5">
  586. g)  The standard stream objects declared by header file <b><iostream.h></b> are 
  587. _______ , _______ , _______ , and_______ .<br>
  588. h)  The <b>ostream</b> member function  ________ outputs a character to the 
  589. specified stream.<br>
  590. i)  The <b>ostream</b> member function  ________ is generally used to write data to 
  591. a randomly accessed file.<br>
  592. j)  The <b>istream</b> member function  ________ repositions the file position 
  593. pointer in a file.<br>
  594. <br>
  595. <br>
  596.  
  597. </page>
  598. <page pagename="Exercise 14.6">
  599. <b>Exercise 14.6</b><br>
  600. State which of the following are true and which are false (and for those that are 
  601. false, explain why):<br>
  602. a)  The impressive functions performed by computers essentially involve the 
  603. manipulation of zeros and ones.<br>
  604. b)  People prefer to manipulate bits instead of characters and fields because bits 
  605. are more compact.<br>
  606. c)  People specify programs and data items as characters; computers then 
  607. manipulate and process these characters as groups of zeros and ones.<br>
  608. d)  A person's 5-digit zip code is an example of a numeric field.<br>
  609. e)  A person's street address is generally considered to be an alphabetic field in 
  610. computer applications.<br>
  611.  
  612. </page>
  613. <page pagename="Exercise 14.6">
  614. f)  Data items represented in computers form a data hierarchy in which data 
  615. items become larger and more complex as we progress from fields to characters 
  616. to bits, etc.<br>
  617. g)  A record key identifies a record as belonging to a particular field.<br>
  618. h)  Most organizations store all their information in a single file to facilitate 
  619. computer processing.<br>
  620. i)  Each statement that processes a file in a C++ program explicitly refers to that 
  621. file by name.<br>
  622. j)  When a program creates a file, the file is automatically retained by the 
  623. computer for future reference.<br>
  624. <br>
  625. <br>
  626.  
  627. </page>
  628. <page pagename="Exercise 14.7">
  629. <b>Exercise 14.7</b><br>
  630. <a href="^Exercises::c:s0p4"><img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 14.3</a> asked the reader to write a series of single statements. Actually, 
  631. these statements form the core of an important type of file processing program, 
  632. namely, a file-matching program. In commercial data processing, it is common 
  633. to have several files in each application system. In an accounts receivable 
  634. system, for example, there is generally a master file containing detailed 
  635. information about each customer such as the customer's name, address, 
  636. telephone number, outstanding balance, credit limit, discount terms, contract 
  637. arrangements, and possibly a condensed history of recent purchases and cash 
  638. payments.<br>
  639. As transactions occur (i.e., sales are made and cash payments arrive in the mail), 
  640. they are entered into a file. At the end of each business period (i.e., a month for<br>
  641. <foreign  name="answers" url="^Answers::c:s0p6">
  642.  
  643. </page>
  644. <page pagename="Exercise 14.7">
  645. some companies, a week for others, and a day in some cases) the file of 
  646. transactions (called "<b>trans.dat</b>" in <a href="^Exercises::c:s0p4"><img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 14.3</a>) is applied to the master file 
  647. (called "<b>oldmast.dat</b>" in <a href="^Exercises::c:s0p4"><img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 14.3</a>), thus updating each account's record of 
  648. purchases and payments. During an updating run, the master file is rewritten as a 
  649. new file ("<b>newmast.dat</b>"), which is then used at the end of the next business 
  650. period to begin the updating process again.<br>
  651. File-matching programs must deal with certain problems that do not exist in 
  652. single-file programs. For example, a match does not always occur. A customer 
  653. on the master file may not have made any purchases or cash payments in the 
  654. current business period, and therefore no record for this customer will appear on 
  655. the transaction file. Similarly, a customer who did make some purchases or cash<br>
  656. <foreign  name="answers" url="^Answers::c:s0p6">
  657.  
  658. </page>
  659. <page pagename="Exercise 14.7">
  660. payments may have just moved to this community, and the company may not 
  661. have had a chance to create a master record for this customer.<br>
  662. Use the statements written in <a href="^Exercises::c:s0p4"><img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 14.3</a> as a basis for writing a complete file-
  663. matching accounts receivable program. Use the account number on each file as 
  664. the record key for matching purposes. Assume that each file is a sequential file 
  665. with records stored in increasing order by account number.<br>
  666. When a match occurs (i.e., records with the same account number appear on 
  667. both the master file and the transaction file), add the dollar amount on the 
  668. transaction file to the current balance on the master file, and write the 
  669. "<b>newmast.dat</b>" record. (Assume that purchases are indicated by positive 
  670. amounts on the transaction file, and that payments are indicated by negative 
  671. amounts.) When there is a master record for a particular account but no<br>
  672. <foreign  name="answers" url="^Answers::c:s0p6">
  673.  
  674. </page>
  675. <page pagename="Exercise 14.7">
  676. corresponding transaction record, merely write the master record to 
  677. "<b>newmast.dat</b>". When there is a transaction record but no corresponding 
  678. master record, print the message "<b>Unmatched transaction record for account 
  679. number</b>" (fill in the account number from the transaction record).<br>
  680. <foreign  name="answers" url="^Answers::c:s0p6">
  681. <br>
  682.  
  683. </page>
  684. <page pagename="Exercise 14.8">
  685. <b>Exercise 14.8</b><br>
  686. After writing the program of <a href="^Exercises::c:s0p12"><img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 14.7</a>, write a simple program to create 
  687. some test data for checking out the program. Use the following sample account 
  688. data: <img src="graphics/ch14/ex1408a.gif" ><br>
  689.  
  690. </page>
  691. <page pagename="Exercise 14.8">
  692. <img src="graphics/ch14/ex1408b.gif" ><br>
  693. <br>
  694.  
  695. </page>
  696. <page pagename="Exercise 14.9">
  697. <b>Exercise 14.9</b><br>
  698. Run the program of<a href="^Exercises::c:s0p12"> <img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 14.7</a> using the files of test data created in<a href="^Exercises::c:s0p16"> <img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 
  699. 14.8</a>. Print the new master file. Check that the accounts have been updated 
  700. correctly.<br>
  701. <br>
  702. <br>
  703.  
  704. </page>
  705. <page pagename="Exercise 14.10">
  706. <b>Exercise 14.10</b><br>
  707. It is possible (actually common) to have several transaction records with the 
  708. same record key. This occurs because a particular customer might make several 
  709. purchases and cash payments during a business period. Rewrite your accounts 
  710. receivable file-matching program of<a href="^Exercises::c:s0p12"> <img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 14.7</a> to provide for the possibility 
  711. of handling several transaction records with the same record key. Modify the test 
  712. data of<a href="^Exercises::c:s0p16"> <img src="bckgrnds/icons/exercise.gif" align=sidebar>Exercise 14.8</a> to include the following additional transaction records:<br>
  713.  
  714. </page>
  715. <page pagename="Exercise 14.10">
  716. <img src="graphics/ch14/ex14010.gif" ><br>
  717. <br>
  718. <br>
  719.  
  720. </page>
  721. <page pagename="Exercise 14.11">
  722. <b>Exercise 14.11</b><br>
  723. Write a series of statements that accomplish each of the following. Assume the 
  724. structure<br>
  725. <font size=2><br></font><font size=11><pre>
  726. <spacer width=20 height=1>struct person {<p>
  727. <spacer width=20 height=1>   char lastName[15];<p>
  728. <spacer width=20 height=1>   char firstName[15];<p>
  729. <spacer width=20 height=1>   char age[2];<p>
  730. <spacer width=20 height=1>};<p>
  731. </pre></font>
  732. has been defined, and that the random access file has been opened properly.<br>
  733. a)  Initialize the file "<b>nameage.dat</b>" with 100 records containing <b>lastName =</b> 
  734. "<b>unassigned</b>", <b>firstName</b> <b>= </b>"", and <b>age = </b>"<b>0</b>".<br>
  735. b)  Input 10 last names, first names, and ages, and write them to the file.<br>
  736.  
  737. </page>
  738. <page pagename="Exercise 14.11">
  739. c)  Update a record that has information in it, and if there is none tell the user 
  740. "No info".<br>
  741. d)  Delete a record that has information by reinitializing that particular record.<br>
  742. <br>
  743. <br>
  744.  
  745. </page>
  746. <page pagename="Exercise 14.12">
  747. <b>Exercise 14.12</b><br>
  748. You are the owner of a hardware store and need to keep an inventory that can 
  749. tell you what different tools you have, how many of each you have on hand, and 
  750. the cost of each one. Write a program that initializes the random access file 
  751. "<b>hardware.dat</b>" to one hundred empty records, lets you input the data 
  752. concerning each tool, enables you to list all your tools, lets you delete a record 
  753. for a tool that you no longer have, and lets you update <i>any</i> information in the 
  754. file. The tool identification number should be the record number. Use the 
  755. following information to start your file:<br>
  756. <foreign  name="answers" url="^Answers::c:s0p7">
  757.  
  758. </page>
  759. <page pagename="Exercise 14.12">
  760. <img src="graphics/ch14/ex14012.gif" ><br>
  761. <foreign  name="answers" url="^Answers::c:s0p7">
  762.  
  763. </page>
  764. <page pagename="Exercise 14.13">
  765. <b>Exercise 14.13</b><br>
  766. Modify the telephone number word generating program you wrote in Chapter 4 
  767. so that it writes its output to a file. This allows you to read the file at your 
  768. convenience. If you have a computerized dictionary available, modify your 
  769. program to look up the thousands of seven-letter words in the dictionary. Some 
  770. of the interesting seven-letter combinations created by this program may consist 
  771. of two or more words. For example, the phone number 8432677 produces 
  772. "<b>THEBOSS</b>." Modify your program to use the computerized dictionary to 
  773. check each possible seven-letter word to see if it is a valid one-letter word 
  774. followed by a valid six-letter word, a valid two-letter word followed by a valid 
  775. five-letter word, etc.<br>
  776. <br>
  777.  
  778. </page>
  779. <page pagename="Exercise 14.14">
  780. <b>Exercise 14.14</b><br>
  781. Write a program that uses the <b>sizeof</b> operator to determine the sizes in bytes of 
  782. the various data types on your computer system. Write the results to the file 
  783. "<b>datasize.dat</b>" so you may print the results later. The format for the results in 
  784. the file should be:<br>
  785. <foreign  name="answers" url="^Answers::c:s0p8">
  786.  
  787. </page>
  788. <page pagename="Exercise 14.14">
  789. <font size=2><br></font><font size=11><pre>
  790. float                      4<p>
  791. double                     8<p>
  792. long double               16<p>
  793. </pre></font>
  794. Note: The sizes of the built-in data types on your computer may differ from 
  795. those listed above.<br>
  796. <br>
  797. <foreign  name="answers" url="^Answers::c:s0p8">
  798. <br>
  799.  
  800. </page>
  801. </section>
  802. <section type=Popup name=Practice title="Good Practices">
  803. <page>
  804. Open a file for input 
  805. only (using <b>ios::in</b>) if 
  806. the contents of the file 
  807. should not be modified. 
  808. This prevents 
  809. unintentional 
  810. modification of the 
  811. file's contents. This is 
  812. an example of the <br>
  813.  
  814. </page>
  815. <page>
  816. principle of least 
  817. privilege.<br>
  818. <br>
  819.  
  820. </page>
  821. </section>
  822. <section type=Popup name=Perform title="Performance">
  823. <page>
  824. Explicitly close each 
  825. file as soon as it is 
  826. known that the program 
  827. will not reference the 
  828. file again. This can 
  829. reduce resource usage 
  830. in a program that will 
  831. continue executing 
  832. after it no longer needs 
  833. a particular file. This <br>
  834.  
  835. </page>
  836. <page>
  837. practice also improves 
  838. program clarity. <br>
  839. <br>
  840.  
  841. </page>
  842. </section>
  843. <section type=Popup name=Code title="Code Examples">
  844. <page>
  845. <font size=18>Figure 14.4  Creating a sequential file.</font><br>
  846. <applet code=gsl.win.helper.TextBox width=580 height=300>
  847. <param  name="file" value="code/ch14/fig14_04.txt">
  848. </applet><br>
  849. <br>
  850. <foreign  name="copy2disk" url="!jcpy Source/fig14_04.jar">
  851. <foreign  name="audio" url="~audio/Ch14/14fig004.au">
  852. <foreign  name="execute" url="!jarexe Run/fig14_04.jar">
  853. <br>
  854.  
  855. </page>
  856. <page>
  857. <font size=18>Figure 14.7  Reading and printing a sequential file.</font><br>
  858. <applet code=gsl.win.helper.TextBox width=580 height=300>
  859. <param  name="file" value="code/ch14/fig14_07.txt">
  860. </applet><br>
  861. <br>
  862. <foreign  name="copy2disk" url="!jcpy Source/fig14_07.jar">
  863. <foreign  name="audio" url="~audio/Ch14/14fig007.au">
  864. <foreign  name="execute" url="!jarexe Run/fig14_07.jar">
  865. <br>
  866.  
  867. </page>
  868. <page>
  869. <font size=18>Figure 14.8  Credit inquiry program.</font><br>
  870. <applet code=gsl.win.helper.TextBox width=580 height=300>
  871. <param  name="file" value="code/ch14/fig14_08.txt">
  872. </applet><br>
  873. <br>
  874. <foreign  name="copy2disk" url="!jcpy Source/fig14_08.jar">
  875. <foreign  name="audio" url="~audio/Ch14/14fig008.au">
  876. <foreign  name="execute" url="!jarexe Run/fig14_08.jar">
  877. <br>
  878.  
  879. </page>
  880. <page>
  881. <font size=18>Figure 14.11  Creating a random access file sequentially.</font><br>
  882. Note: This program has no ouput to the screen. It creates a file on disk.<br>
  883. <applet code=gsl.win.helper.TextBox width=580 height=300>
  884. <param  name="file" value="code/ch14/fig14_11.txt">
  885. </applet><br>
  886. <br>
  887. <foreign  name="copy2disk" url="!jcpy Source/fig14_11.jar">
  888. <foreign  name="audio" url="~audio/Ch14/14fig011.au">
  889. <foreign  name="execute" url="!jarexe Run/fig14_11.jar">
  890. <br>
  891.  
  892. </page>
  893. <page>
  894. <font size=18>Figure 14.12  Writing data randomly to a random access file.</font><br>
  895. <applet code=gsl.win.helper.TextBox width=580 height=300>
  896. <param  name="file" value="code/ch14/fig14_12.txt">
  897. </applet><br>
  898. <br>
  899. <foreign  name="copy2disk" url="!jcpy Source/fig14_12.jar">
  900. <foreign  name="audio" url="~audio/Ch14/14fig012.au">
  901. <foreign  name="execute" url="!jarexe Run/fig14_12.jar">
  902. <br>
  903.  
  904. </page>
  905. <page>
  906. <font size=18>Figure 14.14  Reading a random access file sequentially.</font><br>
  907. <applet code=gsl.win.helper.TextBox width=580 height=300>
  908. <param  name="file" value="code/ch14/fig14_14.txt">
  909. </applet><br>
  910. <br>
  911. <foreign  name="copy2disk" url="!jcpy Source/fig14_14.jar">
  912. <foreign  name="audio" url="~audio/Ch14/14fig014.au">
  913. <foreign  name="execute" url="!jarexe Run/fig14_14.jar">
  914. <br>
  915.  
  916. </page>
  917. <page>
  918. <font size=18>Figure 14.15  Bank account program.</font><br>
  919. <applet code=gsl.win.helper.TextBox width=580 height=300>
  920. <param  name="file" value="code/ch14/fig14_15.txt">
  921. </applet><br>
  922. <br>
  923. <foreign  name="copy2disk" url="!jcpy Source/fig14_15.jar">
  924. <foreign  name="audio" url="~audio/Ch14/14fig015.au">
  925. <foreign  name="execute" url="!jarexe Run/fig14_15.jar">
  926. <br>
  927.  
  928. </page>
  929. </section>
  930. <section type=Popup name=Objective title="Objectives">
  931. <page>
  932. <indent width=8 delay>*   To be able to create, read, write, and update files.</indent>
  933. <indent width=8 delay>*   To become familiar with sequential access file processing.</indent>
  934. <indent width=8 delay>*   To become familiar with random access file processing.</indent>
  935. <indent width=8 delay>*   To be able to specify high-performance unformatted I/O operations.</indent>
  936. <foreign  name="audio" url="~audio/Ch14/14obj.au">
  937.  
  938. </page>
  939. <page>
  940. <indent width=8 delay>*   To understand the differences between formatted and "raw data" file processing.</indent>
  941. <indent width=8 delay>*   To build a transaction processing program with random access file processing.</indent>
  942. <br>
  943.  
  944. </page>
  945. </section>
  946. <section type=Popup name=Errors title="Common Errors">
  947. <page>
  948. Opening an existing file 
  949. for output (<b>ios::out</b>) 
  950. when, in fact, the user 
  951. wants to preserve the 
  952. file; the contents of the 
  953. file are discarded 
  954. without warning.<br>
  955. <br>
  956.  
  957. </page>
  958. <page>
  959. Using an incorrect 
  960. <b>ofstream</b> object to refer 
  961. to a file.<br>
  962. <br>
  963.  
  964. </page>
  965. <page>
  966. Not opening a file 
  967. before attempting to 
  968. reference it in a 
  969. program.<br>
  970. <br>
  971.  
  972. </page>
  973. </section>
  974. <section type=Body name=Default title="14 File Processing">
  975. <page>
  976. <font size=18 bold>14 File Processing</font><hr>
  977. <a href="#s1p0">14.1<spacer width=20 height=1>Introduction</a>  <br>
  978. <a href="#s2p0">14.2<spacer width=20 height=1>The Data Hierarchy</a>  <br>
  979. <a href="#s3p0">14.3<spacer width=20 height=1>Files and Streams</a>  <br>
  980. <a href="#s4p0">14.4<spacer width=20 height=1>Creating a Sequential Access File</a>  <br>
  981. <a href="#s5p0">14.5<spacer width=20 height=1>Reading Data from a Sequential Access File</a>  <br>
  982. <a href="#s6p0">14.6<spacer width=20 height=1>Updating Sequential Access Files</a>  <br>
  983. <a href="#s7p0">14.7<spacer width=20 height=1>Random Access Files</a>  <br>
  984. <a href="#s8p0">14.8<spacer width=20 height=1>Creating a Random Access File</a>  <br>
  985. <a href="#s9p0">14.9<spacer width=20 height=1>Writing Data Randomly to a Random Access File</a>  <br>
  986. <foreign  name="objectivesButton" url="^Objective::c:s0p0">
  987. <foreign  name="quotes" url="^Quotes::c:s0p0">
  988.  
  989. </page>
  990. <page>
  991. <a href="#s10p0">14.10<spacer width=20 height=1>Reading Data Sequentially from a Random 
  992. Access File</a>  <br>
  993. <a href="#s11p0">14.11<spacer width=20 height=1>Example: A Transaction Processing Program</a>  <br>
  994. <a href="#s12p0">14.12<spacer width=20 height=1>Input/Output of Objects</a>  <br>
  995. <a href="#s13p0">14.13<spacer width=20 height=1>Summary</a>  <br>
  996. <a href="^Terminology::c:s0p0">Terminology</a>  <br>
  997. <a href="^Illustration::c:s0p0">Figures</a>  <br>
  998. <foreign  name="objectivesButton" url="^Objective::c:s0p0">
  999. <foreign  name="quotes" url="^Quotes::c:s0p0">
  1000.  
  1001. </page>
  1002. </section>
  1003. <section type=Body name=Default title="14.1 Introduction">
  1004. <page>
  1005. <font size=18 bold>14.1 Introduction</font><hr>
  1006. Storage of data in variables and arrays is temporary. 
  1007. <i>Files</i> are used for permanent retention of large amounts 
  1008. of data. Computers store files on <i>secondary storage</i> 
  1009. <i>devices</i> such as magnetic disks, optical disks and tapes. 
  1010. In this chapter, we explain how data files are created, 
  1011. updated, and processed by C++ programs. We consider 
  1012. both sequential access files and random access files. We 
  1013. compare formatted data file processing and raw data 
  1014. file processing. We examine techniques for input of 
  1015. data from, and output of data to, <b>string</b>s rather than 
  1016. files in Chapter 19.<br>
  1017.  
  1018. </page>
  1019. </section>
  1020. <section type=Body name=Default title="14.2 The Data Hierarchy">
  1021. <page>
  1022. <font size=18 bold>14.2 The Data Hierarchy</font><hr>
  1023. Ultimately, all data items processed by digital 
  1024. computers are reduced to combinations of zeros and 
  1025. ones. This occurs because it is simple and economical 
  1026. to build electronic devices that can assume two stable 
  1027. states--one state represents 0 and the other state 
  1028. represents 1. It is remarkable that the impressive 
  1029. functions performed by computers involve only the 
  1030. most fundamental manipulations of <b>0</b>s and <b>1</b>s.<br>
  1031. <spacer width=16 height=1>The smallest data item in a computer can assume the 
  1032. value <b>0</b> or the value <b>1</b>. Such a data item is called a <b>bit</b> 
  1033. (short for "<i>b</i>inary dig<i>it</i>"--a digit that can assume one of <br>
  1034.  
  1035. </page>
  1036. <page>
  1037. two values). Computer circuitry performs various 
  1038. simple bit manipulations such as examining the value of 
  1039. a bit, setting the value of a bit, and reversing a bit (from 
  1040. <b>1</b> to <b>0</b> or from <b>0</b> to <b>1</b>).<br>
  1041. <spacer width=16 height=1>It is cumbersome for programmers to work with data in 
  1042. the low-level form of bits. Instead, programmers prefer 
  1043. to work with data in forms such as <i>decimal digits</i> (i.e., 
  1044. 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9), <i>letters</i> (i.e., A through Z, 
  1045. and a through z), and <i>special symbols</i> (i.e., $, @, %, &, 
  1046. *, (, ), -, +, ", :, ?, /, and many others). Digits, letters, 
  1047. and special symbols are referred to as <i>characters</i>. The 
  1048. set of all characters used to write programs and 
  1049. represent data items on a particular computer is called <br>
  1050.  
  1051. </page>
  1052. <page>
  1053. that computer's <i>character set</i>. Since computers can 
  1054. process only <b>1</b>s and <b>0</b>s, every character in a computer's 
  1055. character set is represented as a sequence of <b>1</b>s and <b>0</b>s 
  1056. (called a <i>byte</i>). Bytes are most commonly composed of 
  1057. eight bits. Programmers create programs and data items 
  1058. with characters; computers manipulate and process 
  1059. these characters as patterns of bits.<br>
  1060. <spacer width=16 height=1>Just as characters are composed of bits, <i>fields</i> are 
  1061. composed of characters (or bytes). A field is a group of 
  1062. characters that conveys meaning. For example, a field 
  1063. consisting solely of uppercase and lowercase letters can 
  1064. be used to represent a person's name.<br>
  1065.  
  1066. </page>
  1067. <page>
  1068. Data items processed by computers form a <i>data 
  1069. hierarchy</i> in which data items become larger and more 
  1070. complex in structure as we progress from bits, to 
  1071. characters (bytes), to fields, and so on.<br>
  1072. <spacer width=16 height=1>A <i>record</i> (i.e., a <b>struct</b> or a <b>class</b> in C++) is composed 
  1073. of several fields (called members in C++). In a payroll 
  1074. system, for example, a record for a particular employee 
  1075. might consist of the following fields:<br>
  1076. 1. Employee identification number <br>
  1077. 2. Name<br>
  1078. 3. Address <br>
  1079. 4. Hourly salary rate <br>
  1080. 5. Number of exemptions claimed<br>
  1081.  
  1082. </page>
  1083. <page>
  1084. 6. Year-to-date earnings <br>
  1085. 7. Amount of federal taxes withheld, etc.<br>
  1086. Thus, a record is a group of related fields. In the 
  1087. preceding example, each of the fields belongs to the 
  1088. same employee. Of course, a particular company may 
  1089. have many employees, and will have a payroll record 
  1090. for each employee. A <i>file</i> is a group of related records. 
  1091. A company's payroll file normally contains one record 
  1092. for each employee. Thus, a payroll file for a small 
  1093. company might contain only 22 records, whereas a 
  1094. payroll file for a large company might contain 100,000 
  1095. records. It is not unusual for a company to have many <br>
  1096.  
  1097. </page>
  1098. <page>
  1099. files, each containing millions of characters of 
  1100. information. <a href="^Illustration::c:s0p1"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 14.1</a> illustrates the <i>data hierarchy</i>.<br>
  1101. <spacer width=16 height=1>To facilitate the retrieval of specific records from a file, 
  1102. at least one field in each record is chosen as a <i>record 
  1103. key</i>. A record key identifies a record as belonging to a 
  1104. particular person or entity that is unique from all other 
  1105. records in the file. In the payroll record described 
  1106. previously, the employee identification number would 
  1107. normally be chosen as the record key.<br>
  1108. <spacer width=16 height=1>There are many ways of organizing records in a file. 
  1109. The most common type of organization is called a 
  1110. <i>sequential file</i> in which records are typically stored in 
  1111. order by the record key field. In a payroll file, records <br>
  1112.  
  1113. </page>
  1114. <page>
  1115. are usually placed in order by employee identification 
  1116. number. The first employee record in the file contains 
  1117. the lowest employee identification number, and 
  1118. subsequent records contain increasingly higher 
  1119. employee identification numbers. <br>
  1120. Most businesses utilize many different files to store 
  1121. data. For example, companies may have payroll files, 
  1122. accounts receivable files (listing money due from 
  1123. clients), accounts payable files (listing money due to 
  1124. suppliers), inventory files (listing facts about all the 
  1125. items handled by the business), and many other types of 
  1126. files. A group of related files is sometimes called a 
  1127. <i>database</i>. A collection of programs designed to create <br>
  1128.  
  1129. </page>
  1130. <page>
  1131. and manage databases is called a <i>database management 
  1132. system</i> (DBMS).<br>
  1133.  
  1134. </page>
  1135. <page>
  1136. <b>Drag the correct term to the box associated with the 
  1137. attribute:</b><br>
  1138. <component type="drag" width=48 height=18 label="fields" name="fields">   <component type="drag" width=24 height=18 label="bit" name="bit">   <component type="drag" width=24 height=18 label="key" name="key">   <component type="drag" width=48 height=18 label="record" name="record">   <component type="drag" width=64 height=18 label="database" name="database">  <br>
  1139. Composed of characters or bytes. <component type="drop" width=72 height=18 name="fields">  <br>
  1140. Used to retrieve information from a file. <component type="drop" width=72 height=18 name="key">  <br>
  1141. Composed of several fields. <component type="drop" width=72 height=18 name="record">  <br>
  1142. Smallest data item. <component type="drop" width=72 height=18 name="bit">  <br>
  1143. A group of related files. <component type="drop" width=72 height=18 name="database">  <br>
  1144. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1145.  
  1146. </page>
  1147. </section>
  1148. <section type=Body name=Default title="14.3 Files and Streams">
  1149. <page>
  1150. <font size=18 bold>14.3 Files and Streams</font><hr>
  1151. C++ views each file simply as a sequence of bytes (<a href="^Illustration::c:s0p2">F<img src="bckgrnds/icons/ill_ico.gif" align=sidebar>ig. 
  1152. 14.2</a>). Each file ends either with an <i>end-of-file marker</i> 
  1153. or at a specific byte number recorded in a system-
  1154. maintained, administrative data structure. When a file is 
  1155. <i>opened</i>, an object is created and a stream is associated 
  1156. with the object. In Chapter 11, we saw that four objects 
  1157. are created for us automatically--<b>cin</b>, <b>cout</b>, <b>cerr</b>, and 
  1158. <b>clog</b>. The streams associated with these objects provide 
  1159. communication channels between a program and a 
  1160. particular file or device. For example, the <b>cin</b> object 
  1161. (standard input stream object) enables a program to <br>
  1162.  
  1163. </page>
  1164. <page>
  1165. input data from the keyboard, the <b>cout</b> object (standard 
  1166. output stream object) enables a program to output data 
  1167. to the screen, the <b>cerr</b> and <b>clog</b> objects (standard error 
  1168. stream objects) enable a program to output error 
  1169. messages to the screen.<br>
  1170. <spacer width=16 height=1>To perform file processing in C++, the header files 
  1171. <b><iostream.h></b> and <b><fstream.h></b> must be included. The 
  1172. header <b><fstream.h></b> includes the definitions for the 
  1173. stream classes <b>ifstream</b> (for input from a file), 
  1174. <b>ofstream</b> (for output to a file), and <b>fstream</b> (for input to 
  1175. and output from a file). Files are opened by creating 
  1176. objects of these stream classes. These stream classes are 
  1177. derived from (i.e., inherit the functionality of) classes <br>
  1178.  
  1179. </page>
  1180. <page>
  1181. <b>istream</b>, <b>ostream</b>, and <b>iostream</b>, respectively. Thus, 
  1182. the member functions, operators, and manipulators 
  1183. described in Chapter 11, "C++ Stream Input/Output," 
  1184. can all be applied to file streams as well. The 
  1185. inheritance relationships of the I/O classes discussed to 
  1186. this point are summarized in<a href="^Illustration::c:s0p3"> <img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Fig. 14.3</a>.<br>
  1187.  
  1188. </page>
  1189. </section>
  1190. <section type=Body name=Default title="14.4 Creating a Sequential Access File">
  1191. <page>
  1192. <font size=18 bold>14.4 Creating a Sequential Access File</font><hr>
  1193. C++ imposes no structure on a file. Thus, notions like 
  1194. "record" do not exist in C++ files. Therefore, the 
  1195. programmer must structure files to meet the 
  1196. requirements of applications. In the following example, 
  1197. we see how the programmer can impose a simple record 
  1198. structure on a file. First we present the program, then 
  1199. we analyze it in detail.<br>
  1200. <spacer width=16 height=1><a href="^Code::c:s0p0"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 14.4</a> creates a simple sequential access file that 
  1201. might be used in an accounts receivable system to help 
  1202. manage the money owed by a company's credit clients. 
  1203. For each client, the program obtains an account <br>
  1204.  
  1205. </page>
  1206. <page>
  1207. number, the client's name, and the client's balance (i.e., 
  1208. the amount the client still owes the company for goods 
  1209. and services received in the past). The data obtained for 
  1210. each client constitutes a record for that client. The 
  1211. account number is used as the record key in this 
  1212. application; that is, the file will be created and 
  1213. maintained in account number order. This program 
  1214. assumes the user enters the records in account number 
  1215. order. In a comprehensive accounts receivable system, a 
  1216. sorting capability would be provided so the user could 
  1217. enter the records in any order--the records would then 
  1218. be sorted and written to the file. <br>
  1219.  
  1220. </page>
  1221. <page>
  1222. Now let us examine this program. As stated previously, 
  1223. files are opened by creating objects of stream classes 
  1224. <b>ifstream</b>, <b>ofstream</b> or <b>fstream</b>. In <a href="^Code::c:s0p0"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.4</a>, the file is 
  1225. to be opened for output, so an <b>ofstream</b> object is 
  1226. created. Two arguments are passed to the object's 
  1227. constructor--the <b>filename</b> and the <b>file open mode</b>. For 
  1228. an <b>ofstream</b> object, the file open mode can be either 
  1229. <b>ios::out </b>to output data to a file or <b>ios::app</b> to append 
  1230. data to the end of a file (without modifying any data 
  1231. already in the file). Existing files opened with mode 
  1232. <b>ios::out</b> are <i>truncated</i>--all data in the file is discarded. 
  1233. If the specified file does not yet exist, then a file is 
  1234. created with that filename. The declaration<br>
  1235.  
  1236. </page>
  1237. <page>
  1238. <font size=2><br></font><font size=11><pre>
  1239. ofstream outClientFile( "clients.dat", ios::out );<p>
  1240. </pre></font>
  1241. on line 10 creates an <b>ofstream</b> object named 
  1242. <b>outClientFile</b> associated with the file <b>clients.dat</b> that is 
  1243. opened for output. The arguments "<b>clients.dat</b>" and 
  1244. <b>ios::out</b> are passed to the <b>ofstream</b> <b><a href="^Errors::c:s0p1"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a></b>constructor which 
  1245. opens the file. This establishes a "line of 
  1246. communication" with the file. The arguments are 
  1247. passed to the <b>ofstream</b> constructor function which 
  1248. opens the file. By default, <b>ofstream</b> objects are opened 
  1249. for <a href="^Errors::c:s0p0"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>output, so the statement<br>
  1250. <font size=2><br></font><font size=11><pre>
  1251. ofstream outClientFile( "clients.dat" );<p>
  1252. </pre></font>
  1253.  
  1254. </page>
  1255. <page>
  1256. could have been used to open <b>clients.dat</b> for output. 
  1257. <a href="^Illustration::c:s0p4"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 14.5</a> lists the file open modes. <br>
  1258. <spacer width=16 height=1><a href="^Errors::c:s0p2"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>An <b>ofstream</b> object can be created without opening a 
  1259. specific file--a file can be attached to the object later. 
  1260. For example, the declaration<br>
  1261. <font size=2><br></font><font size=11><pre>
  1262. ofstream outClientFile;<p>
  1263. </pre></font>
  1264. creates <b>ofstream</b> object named <b>outClientFile</b>. The 
  1265. <b>ofstream</b> member function <b>open</b> opens a file and 
  1266. attaches it to an existing <b>ofstream</b> object as follows:<br>
  1267. <font size=2><br></font><font size=11><pre>
  1268. outClientFile.open( "clients.dat", ios::out );<p>
  1269. </pre></font>
  1270. After creating an <b>ofstream</b> object and attempting to 
  1271. open it, the program tests whether the open operation <br>
  1272.  
  1273. </page>
  1274. <page>
  1275. was successful. The condition in the <b>if</b> structure at lines 
  1276. 12 through 15<br>
  1277. <font size=2><br></font><font size=11><pre>
  1278. if ( !outClientFile ) {<p>
  1279.    cerr << "File could not be opened" << endl;<p>
  1280.    exit( 1 );<p>
  1281. }<p>
  1282. </pre></font>
  1283. uses the overloaded <b>ios</b> operator member function 
  1284. <b>operator!</b> to determine if the open operation 
  1285. succeeded. The condition returns a nonzero (true) value 
  1286. if either the <b>failbit</b> or <b>badbit</b> are set for the stream on 
  1287. the <b>open</b> operation. Some possible errors are attempting 
  1288. to open a nonexistent file for reading, attempting to <br>
  1289.  
  1290. </page>
  1291. <page>
  1292. open a file for reading without permission, and opening 
  1293. a file for writing when no disk space is available. <br>
  1294. <spacer width=16 height=1>When the condition indicates that the open attempt was 
  1295. unsuccessful, the error message "<b>File could not be 
  1296. opened</b>" is output, and function <b>exit</b> is called to end the 
  1297. program. The argument to <b>exit</b> is returned to the 
  1298. environment from which the program was invoked. 
  1299. Argument <b>0</b> indicates that the program terminated 
  1300. normally; any other value indicates that the program 
  1301. terminated due to an error. The value returned by <b>exit</b> is 
  1302. used by the calling environment (most likely the 
  1303. operating system) to respond appropriately to the error. <br>
  1304.  
  1305. </page>
  1306. <page>
  1307. Another overloaded <b>ios</b> operator member function--
  1308. <b>operator void*</b>--converts the stream to a pointer so it 
  1309. can be tested as <b>0</b> (the null pointer) or nonzero (any 
  1310. other pointer value). If the <b>failbit</b> or <b>badbit</b> (see 
  1311. Chapter 11) have been set for the stream, <b>0</b> (false) is 
  1312. returned. The condition in the following <b>while</b> header 
  1313. (line 24) automatically invokes the <b>operator void*</b> 
  1314. member function. <br>
  1315. <font size=2><br></font><font size=11><pre>
  1316. while ( cin >> account >> name >> balance )<p>
  1317. </pre></font>
  1318. The condition will remain <b>true</b> as long as neither the 
  1319. <b>failbit</b> nor the <b>badbit</b> has been set for <b>cin</b>. Entering the 
  1320. end-of-file indicator sets the <b>failbit</b> for <b>cin</b>. The 
  1321. <b>operator void *</b> function can be used to test an input <br>
  1322.  
  1323. </page>
  1324. <page>
  1325. object for end-of-file instead of explicitly calling the 
  1326. <b>eof</b> member function on the input object.<br>
  1327. <spacer width=16 height=1>If the file is opened successfully, the program begins 
  1328. processing data. The following statement (lines 17 and 
  1329. 18) prompts the user to enter the various fields for each 
  1330. record, or to enter end-of-file when data entry is 
  1331. complete:<br>
  1332. <font size=2><br></font><font size=11><pre>
  1333. cout << "Enter the account, name, and balance.\n"<p>
  1334.      << "Enter EOF to end input.\n? ";<p>
  1335. </pre></font>
  1336. <a href="^Illustration::c:s0p5"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 14.6</a> lists the keyboard combinations for 
  1337. entering end-of-file for various computer systems. <br>
  1338. <spacer width=16 height=1>Line 24 <br>
  1339. <font size=2><br></font><font size=11><pre>
  1340. while ( cin >> account >> name >> balance )<p>
  1341. </pre></font>
  1342.  
  1343. </page>
  1344. <page>
  1345. inputs each set of data and determines if end-of-file has 
  1346. been entered. When end-of-file or bad data is entered, 
  1347. the stream-extraction operation <b>>></b> on <b>cin</b> returns <b>0</b> 
  1348. (normally this stream extraction returns <b>cin</b>) and the 
  1349. <b>while</b> structure terminates. The user enters end-of-file 
  1350. to inform the program that there is no more data to be 
  1351. processed. The end-of-file indicator is set when the 
  1352. end-of-file key combination is entered by the user. The 
  1353. <b>while</b> structure continues looping as long as the end-of-
  1354. file indicator has not been entered. <br>
  1355. <spacer width=16 height=1>Lines 25 and 26<br>
  1356. <font size=2><br></font><font size=11><pre>
  1357. outClientFile << account << ' ' << name<p>
  1358.               << ' ' << balance << '\n';<p>
  1359. </pre></font>
  1360.  
  1361. </page>
  1362. <page>
  1363. write a set of data to the file "<b>clients.dat</b>" using the 
  1364. stream-insertion operator <b><<</b> and the <b>outClientFile</b> 
  1365. object associated with the file at the beginning of the 
  1366. program. The data may be retrieved by a program 
  1367. designed to read the file (see <a href="#s5p0">Section 14.5</a>). Note that 
  1368. the file created in <a href="^Code::c:s0p0"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.4</a> is a text file. It can be read 
  1369. by any text editor.<br>
  1370. <spacer width=16 height=1>Once the end-of-file indicator is entered, main 
  1371. terminates. This causes the <b>outClientFile</b> object to be 
  1372. destroyed thus invoking its destructor function which 
  1373. closes the file <b>clients.dat</b>. <a href="^Perform::c:s0p0"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>An <b>ofstream</b> object can 
  1374. explicitly be closed by the programmer using member 
  1375. function <b>close</b> as follows:<br>
  1376.  
  1377. </page>
  1378. <page>
  1379. <font size=2><br></font><font size=11><pre>
  1380. outClientFile.close();<p>
  1381. </pre></font>
  1382. In the sample execution for the program of<a href="^Code::c:s0p0"> <img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.4</a>, 
  1383. the user enters information for five accounts, and then 
  1384. signals that data entry is complete by entering end-of-
  1385. file (^Z appears on screens of IBM PC compatibles). 
  1386. This dialog window does not show how the data 
  1387. records actually appear in the file. To verify that the file 
  1388. has been created successfully, in the next section we 
  1389. create a program to read the file and print its contents. <br>
  1390.  
  1391. </page>
  1392. </section>
  1393. <section type=Body name=Default title="14.5 Reading Data from a Sequential Access File">
  1394. <page>
  1395. <font size=18 bold>14.5 Reading Data from a Sequential Access 
  1396. File</font><hr>
  1397. Data is stored in files so that it may be retrieved for 
  1398. processing when needed. The previous section 
  1399. demonstrated how to create a file for sequential access. 
  1400. In this section, we discuss how to read data sequentially 
  1401. from a file.<br>
  1402. <spacer width=16 height=1><a href="^Code::c:s0p1"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 14.7</a> reads records from the file "<b>clients.dat</b>" 
  1403. created by the program of <a href="^Code::c:s0p0"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.4</a> and prints the 
  1404. contents of the records. Files are opened for input by 
  1405. creating an <b>ifstream</b> class object. Two arguments are <br>
  1406.  
  1407. </page>
  1408. <page>
  1409. passed to the object--the filename and the file open 
  1410. mode. The declaration<br>
  1411. <font size=2><br></font><font size=11><pre>
  1412. ifstream inClientFile( "clients.dat", ios::in );<p>
  1413. </pre></font>
  1414. in line 13 creates an <b>ifstream</b> object called <b>inClientFile</b> 
  1415. and associates with it the file <b>clients.dat</b> that is to be 
  1416. opened for input. The arguments in parentheses are 
  1417. passed to the <b>ifstream</b> constructor function which 
  1418. opens the file and establishes a "line of 
  1419. communication" with the file. <br>
  1420. <spacer width=16 height=1><a href="^Practice::c:s0p0"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>Objects of class <b>ifstream</b> are opened for input by 
  1421. default, so the statement<br>
  1422. <font size=2><br></font><font size=11><pre>
  1423. ifstream inClientFile( "clients.dat" );<p>
  1424. </pre></font>
  1425.  
  1426. </page>
  1427. <page>
  1428. could have been used to open <b>clients.dat</b> for input. Just 
  1429. as with an <b>ofstream</b> object, an <b>ifstream</b> object can be 
  1430. created without opening a specific file and a file can be 
  1431. attached to it later. <br>
  1432. <spacer width=16 height=1>The program uses the condition <b>!inClientFile</b> to 
  1433. determine whether the file was opened successfully 
  1434. before attempting to retrieve data from the file. Line 27<br>
  1435. <font size=2><br></font><font size=11><pre>
  1436. while ( inClientFile >> account >> name >> balance )<p>
  1437. </pre></font>
  1438. reads a set of data (i.e., a record) from the file. After the 
  1439. preceding line is executed the first time, <b>account</b> has 
  1440. the value <b>100</b>, <b>name</b> has the value "<b>Jones"</b>, and 
  1441. <b>balance</b> has the value <b>24.98</b>. Each time the line is <br>
  1442.  
  1443. </page>
  1444. <page>
  1445. executed, another record is read from the file into the 
  1446. variables <b>account</b>, <b>name</b>, and <b>balance</b>. The records are 
  1447. displayed using function <b>outputLine</b> which uses 
  1448. parameterized stream manipulators to format the data 
  1449. for display. When the end of the file has been reached, 
  1450. the input sequence in the <b>while</b> structure returns <b>0</b> 
  1451. (normally the stream <b>inClientFile</b> is returned), the file 
  1452. is closed by the <b>ifstream</b> destructor function, and the 
  1453. program terminates. <br>
  1454. <spacer width=16 height=1>To retrieve data sequentially from a file, programs 
  1455. normally start reading from the beginning of the file, 
  1456. and read all the data consecutively until the desired data 
  1457. are found. It may be necessary to process the file <br>
  1458.  
  1459. </page>
  1460. <page>
  1461. sequentially several times (from the beginning of the 
  1462. file) during the execution of a program. Both the 
  1463. <b>istream</b> class and the <b>ostream</b> class provide member 
  1464. functions for repositioning the<i> file position pointer</i> (the 
  1465. byte number of the next byte in the file to be read or 
  1466. written). These member functions are <b>seekg</b> ("seek 
  1467. get") for the <b>istream</b> class and <b>seekp</b> ("seek put") for 
  1468. the <b>ostream</b> class. Each <b>istream</b> object has a "get 
  1469. pointer" that indicates the byte number in the file from 
  1470. which the next input is to occur, and each <b>ostream</b> 
  1471. object has a "put pointer" that indicates the byte number 
  1472. in the file at which the next output is to be placed. The 
  1473. statement<br>
  1474.  
  1475. </page>
  1476. <page>
  1477. <font size=2><br></font><font size=11><pre>
  1478. inClientFile.seekg( 0 );<p>
  1479. </pre></font>
  1480. repositions the file position pointer to the beginning of 
  1481. the file (location <b>0</b>) attached to <b>inClientFile</b>. The 
  1482. argument to <b>seekg</b> is normally a long integer. A 
  1483. second argument can be specified to indicate the <i>seek 
  1484. direction</i>. The seek direction can be <b>ios::beg</b> (the 
  1485. default) for positioning relative to the beginning of a 
  1486. stream, <b>ios::cur</b> for positioning relative to the current 
  1487. position in a stream, and <b>ios::end</b> for positioning 
  1488. relative to the end of a stream. The file position pointer 
  1489. is an integer value that specifies the location in the file 
  1490. as a number of bytes from the starting location of the 
  1491. file (this is sometimes referred to as the <i>offset</i> from the <br>
  1492.  
  1493. </page>
  1494. <page>
  1495. beginning of the file). Some examples of positioning 
  1496. the "get" file position pointer are:<br>
  1497. <font size=2><br></font><font size=11><pre>
  1498. // position to the nth byte of fileObject <p>
  1499. // assumes ios::beg<p>
  1500. fileObject.seekg( n );<p>
  1501. // position n bytes forward in fileObject<p>
  1502. fileObject.seekg( n, ios::cur );<p>
  1503. // position y bytes back from end of fileObject<p>
  1504. fileObject.seekg( y, ios::end );<p>
  1505. // position at end of fileObject<p>
  1506. fileObject.seekg( 0, ios::end );<p>
  1507. </pre></font>
  1508. The same operations can be performed with <b>ostream</b> 
  1509. member function <b>seekp</b>. Member functions <b>tellg</b> and 
  1510. <b>tellp</b> are provided to return the current locations of the <br>
  1511.  
  1512. </page>
  1513. <page>
  1514. "get" and "put" pointers, respectively. The following 
  1515. statement assigns the "get" file position pointer value to 
  1516. variable <b>location</b> of type <b>long</b>.<br>
  1517. <font size=2><br></font><font size=11><pre>
  1518. location = filObject.tellg();<p>
  1519. </pre></font>
  1520. <a href="^Code::c:s0p2"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 14.8</a> enables a credit manager to display the 
  1521. account information for those customers with zero 
  1522. balances (i.e., customers who do not owe the company 
  1523. any money), credit balances (i.e., customers to whom 
  1524. the company owes money), and debit balances (i.e., 
  1525. customers who owe the company money for goods and 
  1526. services received in the past). The program displays a 
  1527. menu and allows the credit manager to enter one of 
  1528. three options to obtain credit information. Option 1 <br>
  1529.  
  1530. </page>
  1531. <page>
  1532. produces a list of accounts with zero balances. Option 2 
  1533. produces a list of accounts with credit balances. Option 
  1534. 3 produces a list of accounts with debit balances. 
  1535. Option 4 terminates program execution. Entering an 
  1536. invalid option simply displays the prompt to enter 
  1537. another choice. A sample output is shown in Fig. 14.9.<br>
  1538.  
  1539. </page>
  1540. <page>
  1541. <b>Select the correct statement. </b><br>
  1542. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect.">
  1543. infile > x > y > z;.   <br>
  1544. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect. ">
  1545. ifstream( "data.dat", ios::in );.   <br>
  1546. <component type="checkbox" width=20 height=18 label="" name=""  correct="Correct.">
  1547. ifstream temp( "x.dat", ios::in );. <br>
  1548. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect.">
  1549. #include <filestream.h> // for ifstream.   <br>
  1550. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect.">
  1551. fileObject = seekg( 0, ios::end );.   <br>
  1552. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1553.  
  1554. </page>
  1555. </section>
  1556. <section type=Body name=Default title="14.6 Updating Sequential Access Files">
  1557. <page>
  1558. <font size=18 bold>14.6 Updating Sequential Access Files</font><hr>
  1559. Data that is formatted and written to a sequential access 
  1560. file as shown in<a href="#s4p0"> Section 14.4</a> cannot be modified 
  1561. without the risk of destroying other data in the file. For 
  1562. example, if the name "<b>White</b>" needed to be changed to 
  1563. "<b>Worthington</b>", the old name cannot simply be 
  1564. overwritten. The record for <b>White</b> was written to the 
  1565. file as<br>
  1566. <font size=2><br></font><font size=11><pre>
  1567. 300 White 0.00<p>
  1568. </pre></font>
  1569. If this record is rewritten beginning at the same location 
  1570. in the file using the longer name, the record would be<br>
  1571. <font size=2><br></font><font size=11><pre>
  1572. 300 Worthington 0.00<p>
  1573. </pre></font>
  1574.  
  1575. </page>
  1576. <page>
  1577. The new record contains six more characters than the 
  1578. original record. Therefore, the characters beyond the 
  1579. second "<b>o</b>" in "<b>Worthington</b>" would overwrite the 
  1580. beginning of the next sequential record in the file. The 
  1581. problem here is that in the formatted input/output model 
  1582. using the insertion operator <b><<</b> and the extraction 
  1583. operator <b>>></b>, fields--and hence records--can vary in 
  1584. size. For example, 7, 14, 117, 2074, and 27383 are all 
  1585. <b>int</b>s and each is stored in the same number of "raw 
  1586. data" bytes internally, but when these integers are 
  1587. output as formatted text to the screen or to a file on 
  1588. disk, they become different-sized fields. Therefore, the <br>
  1589.  
  1590. </page>
  1591. <page>
  1592. formatted input/output model is not usually used to 
  1593. update records in place.<br>
  1594. <spacer width=16 height=1>Such updating can be done, but it is awkward. For 
  1595. example, to make the preceding name change, the 
  1596. records before <b>300 White 0.00</b> in a sequential access 
  1597. file could be copied to a new file, the updated record 
  1598. would then be written to the new file, and the records 
  1599. after <b>300 White 0.00</b> would be copied to the new file. 
  1600. This requires processing every record in the file to 
  1601. update one record. If many records are being updated in 
  1602. one pass of the file, then this technique can be 
  1603. acceptable.<br>
  1604.  
  1605. </page>
  1606. </section>
  1607. <section type=Body name=Default title="14.7 Random Access Files">
  1608. <page>
  1609. <font size=18 bold>14.7 Random Access Files</font><hr>
  1610. So far, we have seen how to create sequential access 
  1611. files and to search through them to locate particular 
  1612. information. Sequential access files are inappropriate 
  1613. for so-called <i>"instant-access" applications</i> in which a 
  1614. particular record of information must be located 
  1615. immediately. Some popular instant access applications 
  1616. are airline reservation systems, banking systems, point-
  1617. of-sale systems, automated teller machines and other 
  1618. kinds of <i>transaction processing systems</i> that require 
  1619. rapid access to specific data. The bank at which you 
  1620. have your account may have hundreds of thousands or <br>
  1621.  
  1622. </page>
  1623. <page>
  1624. even millions of other customers, yet when you use an 
  1625. automated teller machine, your account is checked for 
  1626. sufficient funds in seconds. This kind of instant access 
  1627. is possible with <i>random access files</i>. Individual records 
  1628. of a random access file can be accessed directly (and 
  1629. quickly) without searching through other records.   <br>
  1630. <spacer width=16 height=1>As we have said, C++ does not impose structure on a 
  1631. file. So the application that wants to use random access 
  1632. files must literally create them. A variety of techniques 
  1633. can be used to create random access files. Perhaps the 
  1634. simplest is to require that all records in a file are of the 
  1635. same fixed length. Using fixed length records makes it 
  1636. easy for a program to calculate (as a function of the <br>
  1637.  
  1638. </page>
  1639. <page>
  1640. record size and the record key) the exact location of any 
  1641. record relative to the beginning of the file. We will soon 
  1642. see how this facilitates immediate access to specific 
  1643. records, even in large files. <br>
  1644. <spacer width=16 height=1><a href="^Illustration::c:s0p6"><img src="bckgrnds/icons/ill_ico.gif" align=sidebar>Figure 14.10</a> illustrates C++'s view of a random access 
  1645. file composed of fixed-length records (each record is 
  1646. 100 bytes long). A random access file is like a railroad 
  1647. train with many cars--some empty and some with 
  1648. contents. <br>
  1649. <spacer width=16 height=1>Data can be inserted in a random access file without 
  1650. destroying other data in the file. Data stored previously 
  1651. also can be updated or deleted without rewriting the 
  1652. entire file. In the following sections we explain how to <br>
  1653.  
  1654. </page>
  1655. <page>
  1656. create a random access file, enter data, read the data 
  1657. both sequentially and randomly, update the data, and 
  1658. delete data no longer needed.<br>
  1659.  
  1660. </page>
  1661. <page>
  1662. <b>Select the true statement(s). </b><br>
  1663. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1664. Data stored in a random-access file can be deleted or updated without rewriting the entire file.  <br>
  1665. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. C++ does not impose any structure on a file.">
  1666. C++ imposes a random access structure on a file by default. <br>
  1667. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1668. A random-access file can be read sequentially.  <br>
  1669. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1670.  
  1671. </page>
  1672. </section>
  1673. <section type=Body name=Default title="14.8 Creating a Random Access File">
  1674. <page>
  1675. <font size=18 bold>14.8 Creating a Random Access File</font><hr>
  1676. The <b>ostream</b> member function <b>write</b> outputs a fixed 
  1677. number of bytes beginning at a specific location in 
  1678. memory to the specified stream. When the stream is 
  1679. associated with a file, the data is written beginning at 
  1680. the location in the file specified by the "put" file 
  1681. position pointer. The <b>istream</b> member function <b>read</b> 
  1682. inputs a fixed number of bytes from the specified 
  1683. stream to an area in memory beginning at a specified 
  1684. address. If the stream is associated with a file, the bytes 
  1685. are input beginning at the location in the file specified 
  1686. by the "get" file position pointer. <br>
  1687.  
  1688. </page>
  1689. <page>
  1690. Now, when writing an integer <b>number</b> to a file, instead 
  1691. of using <br>
  1692. <font size=2><br></font><font size=11><pre>
  1693. outFile << number;<p>
  1694. </pre></font>
  1695. which could print as few as 1 digit or as many as 11 
  1696. digits (10 digits plus a sign, each of which requires 1 
  1697. byte of storage) for a 4-byte integer, we can use<br>
  1698. <font size=2><br></font><font size=11><pre>
  1699. outFile.write( reinterpret_cast<const char *>( &number ), <p>
  1700.                sizeof( number ) );<p>
  1701. </pre></font>
  1702. which always writes 4 bytes (on a machine with 4-byte 
  1703. integers). The <b>write</b> function expects a first argument 
  1704. of type <b>const char *</b>, hence we used the 
  1705. <b>reinterpret_cast<const char *></b> cast operator to <br>
  1706.  
  1707. </page>
  1708. <page>
  1709. convert the address of <b>number</b> to a <b>const char *</b> 
  1710. pointer. The second argument of <b>write</b> is an integer of 
  1711. type <b>size_t</b> specifying the number of bytes to be 
  1712. written. As we will see, <b>istream</b> function <b>read</b> can then 
  1713. be used to read the 4 bytes back into integer variable 
  1714. <b>number</b>. <br>
  1715. <spacer width=16 height=1>Random access file processing programs rarely write a 
  1716. single field to a file. Normally, they write one <b>struct</b> or 
  1717. <b>class</b> object at a time, as we show in the following 
  1718. examples. <br>
  1719. <spacer width=16 height=1>Consider the following problem statement:<br>
  1720. <font size=6><br></font><indent width=16><font size=14><i>Create a credit processing program capable of storing up 
  1721. to 100 fixed-length records for a company that can have </i></font></indent><font size=6><br></font>
  1722.  
  1723. </page>
  1724. <page>
  1725. <font size=6><br></font><indent width=16><font size=14><i>up to 100 customers. Each record should consist of an account number that will be used as the record key, a last 
  1726. name, a first name, and a balance. The program should be 
  1727. able to update an account, insert a new account, delete an 
  1728. account, and list all the account records in a formatted 
  1729. text file for printing.</i></font></indent><font size=6><br></font>
  1730. The next several sections introduce the techniques 
  1731. necessary to create this credit processing program. 
  1732. <a href="^Code::c:s0p3"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 14.11</a> illustrates opening a random access file, 
  1733. defining the record format using a <b>struct</b> (defined in 
  1734. header file <b>clntdata.h</b>) and writing data to the disk. This 
  1735. program initializes all 100 records of the file 
  1736. "<b>credit.dat</b>" with empty <b>struct</b>s using function <b>write</b> <br>
  1737.  
  1738. </page>
  1739. <page>
  1740. (at lines 34 and 35). Each empty <b>struct</b> contains <b>0</b> for 
  1741. the account number, the null string (represented by 
  1742. empty quotation marks) for the last name, the null 
  1743. string for the first name and <b>0.0</b> for the balance. The file 
  1744. is initialized with the proper amount of empty space in 
  1745. which the account data will be stored, and to determine 
  1746. in subsequent programs if each record is empty or 
  1747. contains data. <br>
  1748. <spacer width=16 height=1>In <a href="^Code::c:s0p3"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.11</a>, the statement at lines 34 through 36<br>
  1749. <font size=2><br></font><font size=11><pre>
  1750. outCredit.write( <p>
  1751.    reinterpret_cast<const char *>( &blankClient ), <p>
  1752.    sizeof( clientData ) );<p>
  1753. </pre></font>
  1754.  
  1755. </page>
  1756. <page>
  1757. causes the structure <b>blankClient</b> of size <b>sizeof( 
  1758. clientData )</b> to be written to the <b>credit.dat </b>file 
  1759. associated with <b>ofstream</b> object <b>outCredit</b>. Remember 
  1760. that operator <b>sizeof</b> returns the size in bytes of the 
  1761. object contained in parentheses (see Chapter 5). Note 
  1762. that the first argument to function <b>write</b> on line 34 must 
  1763. be of type <b>const char *</b>. However, data type of 
  1764. <b>&blankClient</b> is <b>clientData *.</b> To convert 
  1765. <b>&blankClient</b> to the appropriate pointer type, the 
  1766. expression<br>
  1767. <font size=2><br></font><font size=11><pre>
  1768. reinterpret_cast<const char *>( &blankClient )<p>
  1769. </pre></font>
  1770.  
  1771. </page>
  1772. <page>
  1773. uses the cast operator <b>reinterpret_cast</b> to convert the 
  1774. address of <b>blankClient</b> to a <b>const char *</b> so the call to 
  1775. <b>write</b> compiles without issuing a syntax error.<br>
  1776.  
  1777. </page>
  1778. <page>
  1779. <b>Select the correct statement. </b><br>
  1780. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect.">
  1781. output.write( 500 ); // write 500 bytes.   <br>
  1782. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect. ">
  1783. output.write( x, y ); // write 2 ints.   <br>
  1784. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect.">
  1785. ofstream.write( "hello" );.   <br>
  1786. <component type="checkbox" width=20 height=18 label="" name=""  correct="Correct.">
  1787. ofstream outfile( "myfile", ios::out );. <br>
  1788. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1789.  
  1790. </page>
  1791. </section>
  1792. <section type=Body name=Default title="14.9 Writing Data Randomly to a Random Access File">
  1793. <page>
  1794. <font size=18 bold>14.9 Writing Data Randomly to a Random 
  1795. Access File</font><hr>
  1796. The program of <a href="^Code::c:s0p4"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.12</a> writes data to the file 
  1797. "<b>credit.dat</b>". It uses the combination of <b>ostream</b> 
  1798. functions <b>seekp</b> and <b>write</b> to store data at exact 
  1799. locations in the file. Function <b>seekp</b> sets the "put" file 
  1800. position pointer to a specific position in the file, then 
  1801. <b>write</b> outputs the data. A sample execution is shown in 
  1802. <a href="^Code::c:s0p4">F</a> <a href="^Code::c:s0p4"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>ig. 14.13</a>. Note that the program of <a href="^Code::c:s0p4"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.12</a> 
  1803. includes the header file <b>clntdata<tt>.h</tt></b> defined in<a href="^Code::c:s0p3"> <img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 
  1804. 14.11</a>.<br>
  1805. <spacer width=16 height=1>Lines 29 and 30<br>
  1806.  
  1807. </page>
  1808. <page>
  1809. <font size=2><br></font><font size=11><pre>
  1810. outCredit.seekp( ( client.accountNumber - 1 ) * <p>
  1811.                  sizeof( clientData ) );<p>
  1812. </pre></font>
  1813. positions the "put" file position pointer for object 
  1814. <b>outCredit</b> to the byte location calculated by                    
  1815. <b>( client.accountNumber - 1 ) * sizeof( clientData ).</b> 
  1816. Since the account number is between 1 and 100, 1 is 
  1817. subtracted from the account number when calculating 
  1818. the byte location of the record. Thus, for record 1, the 
  1819. file position pointer is set to byte 0 of the file. Note that 
  1820. the <b>ofstream</b> object <b>outCredit</b> is opened with file open 
  1821. mode<b> ios::ate</b>. The "put" file position pointer is set to 
  1822. the end of the file initially, but data can be written 
  1823. anywhere in the file.<br>
  1824.  
  1825. </page>
  1826. <page>
  1827. <b>Select the correct statement. </b><br>
  1828. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect.">
  1829. output.seek( 300 );.   <br>
  1830. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect. ">
  1831. output.fseek( 300 * sizeof( x ) );.   <br>
  1832. <component type="checkbox" width=20 height=18 label="" name=""  correct="Correct.">
  1833. output.seekp( sizeof( record ) );. <br>
  1834. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect.">
  1835. output.seekget( 5000 );.   <br>
  1836. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1837.  
  1838. </page>
  1839. </section>
  1840. <section type=Body name=Default title="14.10 Reading Data Sequentially from a Random Access File">
  1841. <page>
  1842. <font size=18 bold>14.10 Reading Data Sequentially from a Random Access File</font><hr>
  1843. In the previous sections, we created a random access 
  1844. file and wrote data to that file. In this section, we 
  1845. develop a program that reads through the file 
  1846. sequentially and prints only those records containing 
  1847. data. These programs produce an additional benefit. See 
  1848. if you can determine what it is; we will reveal it at the 
  1849. end of this section.<br>
  1850. <spacer width=16 height=1>The <b>istream</b> function <b>read</b> inputs a specified number of 
  1851. bytes from the current position in the specified stream 
  1852. into an object. For example, lines 27 and 28<br>
  1853.  
  1854. </page>
  1855. <page>
  1856. <font size=2><br></font><font size=11><pre>
  1857. inCredit.read( reinterpret_cast<char *>( &client ), <p>
  1858.                sizeof( clientData ) );<p>
  1859. </pre></font>
  1860. from <a href="^Code::c:s0p5"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig 14.14</a> read the number of bytes specified by 
  1861. sizeof( <b>clientData</b> ) from the file associated with 
  1862. <b>ifstream</b> object <b>inCredit</b> and store the data in the 
  1863. structure <b>client</b>. Note that function <b>read</b> requires a first 
  1864. argument of type <b>char *</b>. Since <b>&client</b> is of type 
  1865. <b>clientData *</b>, <b>&client </b>must be cast to <b>char *</b> with the 
  1866. cast operator <b>reinterpret_cast</b>. Note that the program 
  1867. of <a href="^Code::c:s0p5"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.14</a> includes the header file <b>clntdata.h</b> 
  1868. defined in<a href="^Code::c:s0p3"> <img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.11</a>.<br>
  1869.  
  1870. </page>
  1871. <page>
  1872. The program of <a href="^Code::c:s0p5"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.14</a> reads sequentially through 
  1873. every record in the "<b>credit.dat</b>" file, checks each 
  1874. record to see if it contains data, and displays formatted 
  1875. outputs for records containing data. The condition in 
  1876. line 30<br>
  1877. <font size=2><br></font><font size=11><pre>
  1878.    while ( inCredit && !inCredit.eof() ) {<p>
  1879. </pre></font>
  1880. uses the <b>ios</b> member function <b>eof</b> to determine when the 
  1881. end of the file is reached and causes execution of the 
  1882. <b>while</b> structure to terminate. Also, if there is an error 
  1883. reading from the file, the loop will terminate because 
  1884. <b>inCredit</b> will evaluate to <b>false</b>. The data input from the 
  1885. file are output by <b>outputLine</b> which takes two 
  1886. arguments--an <b>ostream</b> object and a <b>clientData</b> <br>
  1887.  
  1888. </page>
  1889. <page>
  1890. structure to be output. The <b>ostream</b> parameter type is 
  1891. interesting because any <b>ostream</b> object (such as <b>cout</b>) 
  1892. or any object of a derived class of <b>ostream</b> (such as an 
  1893. object of type <b>ofstream</b>) can be supplied as the 
  1894. argument. This means that the same function can be 
  1895. used, for example, to perform output to the standard 
  1896. output stream and to a file stream without writing 
  1897. separate functions.<br>
  1898. <spacer width=16 height=1>What about that additional benefit we promised? If you 
  1899. examine the output window, you will notice that the 
  1900. records are listed in sorted order (by account number)! 
  1901. This is a simple consequence of the way we stored 
  1902. these records in the file using direct access techniques. <br>
  1903.  
  1904. </page>
  1905. <page>
  1906. Compared to the bubble sort we have seen (Chapter 4), 
  1907. sorting with direct access techniques is blazingly fast. 
  1908. The speed is achieved by making the file large enough 
  1909. to hold every possible record that might be created. 
  1910. This of course, means that the file could be sparsely 
  1911. occupied most of the time, a waste of storage. So here is 
  1912. yet another example of the space-time trade-off: By 
  1913. using large amounts of space, we are able to develop a 
  1914. much faster sorting algorithm.<br>
  1915.  
  1916. </page>
  1917. <page>
  1918. <b>Select the correct statement. </b><br>
  1919. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect.">
  1920. in.read( x );.   <br>
  1921. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect. ">
  1922. in.t = read( x );.   <br>
  1923. <component type="checkbox" width=20 height=18 label="" name=""  correct="Correct.">
  1924. in.read( reinterpret_cast<char *>(&x), 50 );. <br>
  1925. <component type="checkbox" width=20 height=18 label="" name=""  feedback="Incorrect.">
  1926. if ( !in.EOF ).   <br>
  1927. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1928.  
  1929. </page>
  1930. </section>
  1931. <section type=Body name=Default title="14.11 Example: A Transaction Processing Program">
  1932. <page>
  1933. <font size=18 bold>14.11 Example: A Transaction Processing Program</font><hr>
  1934. We now present a substantial transaction processing 
  1935. program (<a href="^Code::c:s0p6"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.15</a>) using a random access file to 
  1936. achieve "instant" access processing. The program 
  1937. maintains a bank's account information. The program 
  1938. updates existing accounts, adds new accounts, deletes 
  1939. accounts, and stores a formatted listing of all the current 
  1940. accounts in a text file for printing. We assume that the 
  1941. program of<a href="^Code::c:s0p3"> <img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.11</a> has been executed to create the 
  1942. file <b>credit.dat</b> and that the program of <a href="^Code::c:s0p4"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.12</a> has 
  1943. been executed to insert the initial data.<br>
  1944.  
  1945. </page>
  1946. <page>
  1947. The program has five options (option 5 is to terminate 
  1948. the program). Option 1 calls function <b>textFile</b> to store a 
  1949. formatted list of all the account information in a text 
  1950. file called <b>print.txt</b> that may be printed later. Function 
  1951. <b>textFile</b> takes an <b>fstream</b> object as an argument to be 
  1952. used to input data from the <b>credit.dat</b> file. Function 
  1953. <b>textFile</b> uses <b>istream</b> member function <b>read</b> and the 
  1954. sequential file access techniques of <a href="^Code::c:s0p5"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.14</a> to input 
  1955. data from <b>credit.dat</b>. Function <b>outputLine</b> discussed in 
  1956. <a href="^Illustration::c:s0p6">Section 14.10</a> is used to output the data to file <b>print.txt</b>. 
  1957. Note that <b>textFile</b> uses <b>istream</b> member function <b>seekg</b> 
  1958. to ensure that the file position pointer is at the <br>
  1959.  
  1960. </page>
  1961. <page>
  1962. beginning of the file. After choosing Option 1 the file 
  1963. <b>print.txt</b> contains:<img src="graphics/ch14/sec1411a.gif" ><br>
  1964. <spacer width=16 height=1>Option 2 calls the function <b>updateRecord</b> to update an 
  1965. account. The function will only update an existing 
  1966. record, so the function first determines if the specified 
  1967. record is empty. The record is read into structure <b>client</b> <br>
  1968.  
  1969. </page>
  1970. <page>
  1971. with <b>istream</b> member function <b>read</b>, then 
  1972. <b>client.accountNumber </b>is compared to zero to 
  1973. determine if the record contains information. If 
  1974. <b>client.accountNumber </b>is zero, a message is printed 
  1975. stating that the record is empty and the menu choices 
  1976. are displayed. If the record contains information, 
  1977. function <b>updateRecord</b> displays the record on the 
  1978. screen using function <b>outputLine</b>, inputs the 
  1979. transaction amount, calculates the new balance, and <br>
  1980.  
  1981. </page>
  1982. <page>
  1983. rewrites the record to the file. A typical output for 
  1984. Option 2 is:<img src="graphics/ch14/sec1411b.gif" ><br>
  1985. Option 3 calls the function <b>newRecord</b> to add a new 
  1986. account to the file. If the user enters an account number 
  1987. for an existing account, <b>newRecord</b> displays a message 
  1988. that the account exists, and displays the menu choices. 
  1989. This function adds a new account in the same manner <br>
  1990.  
  1991. </page>
  1992. <page>
  1993. as the program of<a href="^Code::c:s0p4"> <img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 14.12</a>. A typical output for 
  1994. Option 3 is:<img src="graphics/ch14/sec1411c.gif" ><br>
  1995. <spacer width=16 height=1>Option 4 calls function <b>deleteRecord</b> to delete a record 
  1996. from the file. The user is prompted to enter the account 
  1997. number. Only an existing record may be deleted, so if 
  1998. the specified account is empty, an error message is 
  1999. issued. If the account exists, it is reinitialized by 
  2000. copying an empty record (<b>blankClient</b>) to the file. A <br>
  2001.  
  2002. </page>
  2003. <page>
  2004. message is displayed to inform the user that the record 
  2005. has been deleted. A typical output for Option 4 is<img src="graphics/ch14/sec1411d.gif" ><br>
  2006. <spacer width=16 height=1>The file "<b>credit.dat</b>" is opened by creating an <b>fstream</b> 
  2007. object for reading and writing using modes <b>ios::in</b> and 
  2008. <b>ios::out</b> "or-ed" together.<br>
  2009.  
  2010. </page>
  2011. </section>
  2012. <section type=Body name=Default title="14.12 Input/Output of Objects">
  2013. <page>
  2014. <font size=18 bold>14.12 Input/Output of Objects</font><hr>
  2015. In this chapter and Chapter 11 we discussed C++'s 
  2016. object-oriented style of input/output. But our examples 
  2017. concentrated on I/O of traditional data types rather than 
  2018. objects of user-defined classes. In Chapter 8, we 
  2019. showed how to input and output class objects using 
  2020. operator overloading. We accomplished object input by 
  2021. overloading the stream-extraction operator <b>>></b> for the 
  2022. appropriate <b>istream</b> classes. We accomplished object 
  2023. output by overloading the stream-insertion operator <b><<</b> 
  2024. for the appropriate <b>ostream</b> classes. In both cases only 
  2025. an object's data members were input or output, and, in <br>
  2026.  
  2027. </page>
  2028. <page>
  2029. each case, in a form meaningful for objects of that 
  2030. particular abstract data type. An object's member 
  2031. functions are available internally in the computer and 
  2032. are combined with the data values as these data are 
  2033. input via the overloaded stream-insertion operator.<br>
  2034. <spacer width=16 height=1>When object data members are output to a disk file, in a 
  2035. sense we lose the object's type information. We only 
  2036. have data, not type information, on a disk. If the 
  2037. program that is going to read this data knows what 
  2038. object type it corresponds to, then the data is simply 
  2039. read into objects of that type.<br>
  2040. <spacer width=16 height=1>An interesting problem occurs when we store objects of 
  2041. different types in the same file. How can we distinguish <br>
  2042.  
  2043. </page>
  2044. <page>
  2045. them (or their collections of data members) as we read 
  2046. them into a program? The problem, of course, is that 
  2047. objects typically do not have type fields (we studied 
  2048. this issue carefully in Chapter 10, "Virtual Functions 
  2049. and Polymorphism").<br>
  2050. <spacer width=16 height=1>One approach would be to have each overloaded output 
  2051. operator output a type code preceding each collection of 
  2052. data members that represents one object. Then object 
  2053. input would always begin by reading the type-code 
  2054. field and using a <b>switch</b> statement to invoke the proper 
  2055. overloaded function. Although this solution lacks the 
  2056. elegance of polymorphic programming, it provides a <br>
  2057.  
  2058. </page>
  2059. <page>
  2060. workable mechanism for retaining objects in files and 
  2061. retrieving them as needed.<br>
  2062.  
  2063. </page>
  2064. </section>
  2065. <section type=Body name=Default title="14.13 Summary ">
  2066. <page>
  2067. <font size=18 bold>14.13 Summary </font><hr>
  2068. <indent width=8 delay>*   All data items processed by a computer are reduced 
  2069. to combinations of zeros and ones. </indent>
  2070. <indent width=8 delay>*   The smallest data item in a computer can assume the 
  2071. value <b>0</b> or the value <b>1</b>. Such a data item is called a bit. </indent>
  2072. <indent width=8 delay>*   Digits, letters, and special symbols are referred to as 
  2073. characters. The set of all characters that may be used to 
  2074. write programs and represent data items on a particular 
  2075. computer is called that computer's character set. Every 
  2076. character in the computer's character set is represented 
  2077. as a pattern of eight <b>1</b>s and <b>0</b>s (called a byte). </indent>
  2078. <indent width=8 delay>*  A field is a group of characters (or bytes) that con</indent>
  2079.  
  2080. </page>
  2081. <page>
  2082. <indent width=8 delay>*   veys meaning. </indent>
  2083. <indent width=8 delay>*   A record is a group of related fields. </indent>
  2084. <indent width=8 delay>*   At least one field in a record is chosen as a record 
  2085. key to identify a record as belonging to a particular person or entity that is unique from all other records in the 
  2086. file. </indent>
  2087. <indent width=8 delay>*   Sequential access is the most popular method of 
  2088. accessing data in a file. </indent>
  2089. <indent width=8 delay>*   A collection of programs designed to create and manage databases is called a database management system 
  2090. (DBMS).</indent>
  2091. <indent width=8 delay>*   C++ views each file as a sequential stream of bytes.</indent>
  2092. <indent width=8 delay>*  Each file ends in some machine-dependent form of </indent>
  2093.  
  2094. </page>
  2095. <page>
  2096. <indent width=8 delay>*   end-of-file marker. </indent>
  2097. <indent width=8 delay>*   Streams provide communication channels between 
  2098. files and programs. </indent>
  2099. <indent width=8 delay>*   The header files <b><iostream.h></b> and <b><fstream.h></b> 
  2100. must be included in a program to perform C++ file I/O. 
  2101. Header <b><fstream.h></b> includes the definitions for the 
  2102. stream classes <b>ifstream</b>, <b>ofstream</b>, and <b>fstream</b>. </indent>
  2103. <indent width=8 delay>*   Files are opened simply by instantiating objects of 
  2104. stream classes <b>ifstream</b>, <b>ofstream</b> and <b>fstream</b>. </indent>
  2105. <indent width=8 delay>*   C++ imposes no structure on a file. Thus, notions 
  2106. like "record" do not exist in C++. The programmer 
  2107. must structure a file to meet the requirements of a particular application. </indent>
  2108.  
  2109. </page>
  2110. <page>
  2111. <indent width=8 delay>*   Files are opened for output by creating an <b>ofstream</b> 
  2112. class object. Two arguments are passed to the object--
  2113. the filename and the file open mode. For an <b>ofstream</b> 
  2114. object, the file open mode can be either <b>ios::out</b> to output data to a file or <b>ios::app</b> to append data to the end 
  2115. of a file. Existing files opened with mode <b>ios::out</b> are 
  2116. truncated. Nonexistent files are created. </indent>
  2117. <indent width=8 delay>*   The <b>ios </b>operator member function <b>operator!</b> returns 
  2118. a nonzero (true) value if either the <b>failbit</b> or <b>badbit</b> 
  2119. have been set for a stream on the <b>open</b> operation. </indent>
  2120. <indent width=8 delay>*  The <b>ios</b> operator member function <b>operator void* 
  2121. </b>converts the stream to a pointer for comparison with <b>0</b> 
  2122. (the null pointer). If either the <b>failbit</b> or <b>badbit</b> have </indent>
  2123.  
  2124. </page>
  2125. <page>
  2126. <indent width=8 delay>*   been set for the stream, <b>0</b> (false) is returned. </indent>
  2127. <indent width=8 delay>*   Programs may process no files, one file, or several 
  2128. files. Each file has a unique name and is associated with 
  2129. an appropriate file stream object. All file processing 
  2130. functions must refer to a file with the appropriate 
  2131. object. </indent>
  2132. <indent width=8 delay>*  A "get pointer" indicates the position in the file from 
  2133. which the next input is to occur, and a "put pointer" 
  2134. indicates the position in the file at which the next output 
  2135. is to be placed. Both the <b>istream</b> class and the <b>ostream</b> 
  2136. class provide member functions for repositioning the 
  2137. file position pointer. The functions are seekg ("seek 
  2138. get") for class <b>istream</b> and <b>seekp</b> ("seek put") for the </indent>
  2139.  
  2140. </page>
  2141. <page>
  2142. <indent width=8 delay>*   <b>ostream</b> class. </indent>
  2143. <indent width=8 delay>*   Member functions <b>tellp</b> and <b>tellg</b> return the current 
  2144. locations of the "put" and "get" pointers, respectively.</indent>
  2145. <indent width=8 delay>*   A convenient way to implement random access files 
  2146. is by using only fixed-length records. Using this technique, a program can quickly calculate the exact location of a record relative to the beginning of the file. </indent>
  2147. <indent width=8 delay>*   Data can be inserted in a random access file without 
  2148. destroying other data in the file. Data can be updated or 
  2149. deleted without rewriting the entire file. </indent>
  2150. <indent width=8 delay>*  The <b>ostream</b> member function <b>write</b> outputs to a 
  2151. specified stream some number of bytes beginning at a 
  2152. designated location in memory. When the stream is </indent>
  2153.  
  2154. </page>
  2155. <page>
  2156. <indent width=8 delay>*   associated with a file, the data is written at the location 
  2157. specified by the "put" file position pointer. </indent>
  2158. <indent width=8 delay>*   The <b>istream</b> member function <b>read</b> inputs some 
  2159. number of bytes from the specified stream to an area in 
  2160. memory beginning with a designated address. The 
  2161. bytes are input beginning at the location specified by 
  2162. the "get" file position pointer. </indent>
  2163. <indent width=8 delay>*   The <b>write</b> function expects a first argument of type 
  2164. <b>const char*</b>, so this argument must be cast to <b>const 
  2165. char*</b> if it is of some other pointer type. The second 
  2166. argument is an integer that specifies the number of 
  2167. bytes to be written. </indent>
  2168. <indent width=8 delay>*  The compile-time, unary operator <b>sizeof</b> returns the </indent>
  2169.  
  2170. </page>
  2171. <page>
  2172. <indent width=8 delay>*   size in bytes of the object contained in parentheses; 
  2173. <b>sizeof</b> returns an unsigned integer. </indent>
  2174. <indent width=8 delay>*   The <b>istream</b> member function <b>read</b> inputs a specified number of bytes from the designated stream into an 
  2175. object; <b>read</b> requires a first argument of type <b>char*</b>. </indent>
  2176. <indent width=8 delay>*   The <b>ios</b> member function <b>eof</b> determines if the end of 
  2177. the file indicator has been set for the designated stream. 
  2178. End-of-file is set after an attempted read fails.</indent>
  2179.  
  2180. </page>
  2181. <page>
  2182. <br>
  2183.  
  2184. </page>
  2185. <page>
  2186.  
  2187. </page>
  2188. </section>
  2189.  
  2190. <section type=Popup name=Debug title="Testing">
  2191. <page>
  2192. This chapter does not contain any Testing and Debugging tips.
  2193. </page>
  2194. </section>
  2195. <section type=Popup name=Portable title="Portability">
  2196. <page>
  2197. This chapter does not contain any Portability tips.
  2198. </page>
  2199. </section>
  2200. <section type=Popup name=AppletPopup title="Applet Examples">
  2201. <page>
  2202. This chapter does not contain any Applet Examples.
  2203. </page>
  2204. </section>
  2205. <section type=Popup name=Engineer title="Engineering">
  2206. <page>
  2207. This chapter does not contain any Software Engineering Observations.
  2208. </page>
  2209. </section>
  2210. </chapter>
  2211. </html>
  2212. </html>
  2213.